Сайт SPYRYTUS_LTD© SPYRYTUS - учеба, работа и развлечения title image
Новости :
    Software News
    Hardware News
Обзоры :
    Главная
    Алгоритмы
    Готовые программы
    Игры
Разработка :
    Свои разработки
    Продажа и заказ ПО
Развлечения :
    Отдохни !

Алгоритм просчета хода 8 ферзями

      Принцип растановки 8 ферзей заключается в том, что нужно поставить 8 ферзей на шахматной доске так, чтобы они себя ни разу ни в одной с позиций не били.
      Алгоритм простой, нужно проверить нет ли кого на текущей позиции по горизонтали (проверка производится в обе стороны от текущей позиции), а затем проверить, что по диагонали на одну позицию от текущей, во все стороны никого нету. Все то, что написанно выше реализовуется в одной маленькой функции, она возвращает 1 если условие проходит, и 0. - если нет.

int FindPosY(int pos[], int k, int y)
{
  int i = 1;
  while ((i < k) && (y != pos[i-1]) && (abs(k-i) != abs(y-pos[i-1]))) ++i;
  if (i == k) return 1;
  else return 0;
}		

      Затем пишем функцию, которая вызывается рекурсивно, и шагает по горизонтали, т.к. прошлая функция, применялась, для расположения ферзя по вертикали, в текущей позиции по горизонтали.

int FoundPer(int k)
{                               
  for (int y = 1; y <= Num; ++y)
  {
    if (FindPosY(pos, k, y)==1)
    {
      pos[k-1] = y;
      if (k == Num)
      {
        ShowField(pos);
        if (getch() == (char)0x1B) exit(1);
        ++Count;
      }
      FoundPer(k+1);
    }
  }
}		

      Функция ShowField примененна для визуализации, как будто фигуры выставляются в область шахматной доски.

int ShowField(int Array[])
{
  int Counter=2,M=0;
  textbackground(6);
  clrscr();
  textcolor(0);

  for (int y=0;y<8;y++)
    for (int x=0;x<8;x++)
    {
      if (y==0 && x==0) cprintf("%c",(char)0xC9);
      if (x==7 && y != 7) cprintf("%c",(char)0xCB);
      if (x>=1 && x<=6) cprintf("%c",(char)0xCD);
      if (x==7 && y==7) cprintf("%c",(char)0xBB);
    }
  for (int y=1;y<=32;y++)
  {
    gotoxy(1,Counter);
    M=0;
    for (int x=1;x<=9;x++)
    {
      if (y==32 && x==1)                        // |_
      {
        cprintf("%c",(char)0xC8);
        for (int u=2;u<8;u++) cprintf("%c",(char)0xCD);
        gotoxy((x*7)+1,Counter);
        M=2;
      }
      if (y==32 && x%1==0 && x!=1 && x!=9)      // _|_
      {
        cprintf("%c",(char)0xCA);
        for (int u=2;u<8;u++) cprintf("%c",(char)0xCD);
        gotoxy((x*7)+1,Counter);
        M=2;
      }
      if (x==1 && y%4==0 && M!=2)                // |-
      {
        cprintf("%c",(char)0xCC);
        for (int u=2;u<8;u++) cprintf("%c",(char)0xCD);
        gotoxy((x*7)+1,Counter);
      }
      if (x>=2 && x<=8 && y%4==0 && M!=2)       // +
      {
        cprintf("%c",(char)0xCE);
        for (int u=2;u<8;u++) cprintf("%c",(char)0xCD);
        gotoxy((x*7)+1,Counter);
      }
      if (x>=1 && x<=9 && y!=4 && M==0)         // |
      {
        cprintf("%c",(char)0xBA);
        gotoxy((x*7)+1,Counter);
      }
      if (x==8 && y%4==0 && M!= 2)              // -|
        {
          cprintf("%c",(char)0xB9);
          gotoxy((x*7)+1,Counter);
          M=1;
        }
      if (y==32 && x==8)                        // _|
      {
        cprintf("%c",(char)0xBC);
        gotoxy((x*7)+1,Counter);
        M=2;
      }
    }
    Counter++;                           
  }
  for (int x=0;x<8;x++) ShowText(((x*2)*3)+(x+3),(32-(Array[x]*4))+2);
  gotoxy(24,35);
  textcolor(4);
  cprintf("VARIANT N%c %d\n",(char)0xF8,Count+1);
}		

      Теперь осталось нарисовать и самого ферзя, функция ниже это и делает.

int ShowText(int X, int Y)
{
  textcolor(1);
  gotoxy(X+1,Y);
  cprintf("%c%c",(char)0xC9,(char)0xBB);
  gotoxy(X+1,Y+1);
  cprintf("%c%c",(char)0xDB,(char)0xDB);
  gotoxy(X,Y+2);
  cprintf("%c%c%c%c",(char)0xDF,(char)0xDF,(char)0xDF,(char)0xDF);
}		

      Наибольше написать прийдется в main - всего одну строчку : FoundPer(1);, и все !

      Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы.

 
  Перейти вверх страници ВВЕРХ Перейти вверх страници
Сайт хостинга Рейтинг посещаемости Поисковая машина Интернет-магазин CD-дисков
Хостинг от uCoz