Показать сообщение отдельно

  #594  
Старый 05.06.2008, 17:34
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

хммм .... классы тут как-то боком!
их придется впихивать совсем без их преимуществ


давай набросаю суть а ты ее засунешь хоть в классы , хоть в мусорку!

будем обозначать символами
a-кресло(arm chair)
c-стул(chair)
t-стол(table)
s-шкаф(shelves)

Код:
#defane MAX_STEPS 50
char a[3][3]; //третий ряд забит нулями
char steps[MAX_STEPS][7];
char rez[3][3];

int abs(int numb)   // просто извращаюсь...
{
   if(numb<0)
     return numb*(-1);
   else
    return numb;
}
void step(int step,int pusto_x,int pusto_y)
{                 // step -текущая глубина рекурси
                  // pusto_x - координата пустого места
                 // pusto_y - координата пустого места
   int i,j,k;
   if(steps<MAX_STEPS-1)
   {
      for(i=0;i<2;i++)
         for(j=0;j<3;j++)
           if(i!=pusto_y || j!=pusto_x) // проверяю чтоб счетчики
                                                       // не совпадали с пустой клеткой
             if(i==pusto_y || j==pusto_x)     // проверяю на условие движения
              if(abs(pusto_x-j)==1)               // через клетку не прыгать              
              {
                 // могем менять местами
                 a[pusto_y][pusto_x]=a[i][j];
                 a[i][j]=' ';                              // передвигаю чегото
                 for(k=0,fl=0;k<MAX_STEPS && k<step && fl==0;k++)
                 if(strcmp(a,rez)==0)            // проверяю не встречалось ли
                    fl=1;                                 // данное расположение
                 if(strcmp(a,rez)==0)           // проверяю не получили ли мы то что 
                 {                                        // нужно достичь
                     // вываливай весь steps
                     // хоть в файл хоть на печать 
                     fl=1;
                 }
                 if(fl==0)
                 {
                   strcpy((char *)&steps[step][0],a); // записываю ход
                   step(step+1,j,i);                       // уход в глубь
                   // стирать ход не нужно поскольку ПЕРЕЗАПИСЬ
                 }
                 a[i][j]=a[pusto_y][pusto_x]; // востанавливаю предыдущее
                 a[pusto_y][pusto_x]=' ';       // состояние
              } 
  }
   else
     return ; // возврат если перебор по глубине
}

void main()
{
  int i,j;
  // подготавливаем массивы
  for(i=0;i<MAX_STEPS;i++)
    strcpy((char *)&steps[i][0],"");
  a[0][0]='t'; // исходный массив
  a[0][1]='c';
  a[0][2]='s';
  a[1][0]='c';
  a[1][1]=' ';
  a[1][2]='a';
  a[2][0]=0;  // забиваем нулями для того чтобы
  a[2][1]=0;  // сформировалась идентифицирующая строка
  a[2][2]=0;
   rez[0][0]='t'; // массив который нужно получить
   rez[0][1]='c';
   rez[0][2]='a';
   rez[1][0]='c';
   rez[1][1]=' ';
   rez[1][2]='s';
   rez[2][0]=0;  // забиваем нулями с целью как и
   rez[2][1]=0;  // для массива a
   rez[2][2]=0;
  steps(0,1,1);
}
КОД НЕ ПРОВЕРЯЛ!!! БИЛ ПРЯМО В ОКНО СООБЩЕНИЙ!

ну мне простительно у меня репутация маленькая
да и решение таких задач тут дешево стоит!

Последний раз редактировалось Delimiter; 06.06.2008 в 16:31..
 
Ответить с цитированием