![]() |
SPYRYTUS - учеба, работа и развлечения | ![]() |
|
Алгоритм просчета хода 8 ферзями
Принцип растановки 8 ферзей заключается в том, что нужно поставить 8 ферзей
на шахматной доске так, чтобы они себя ни разу ни в одной с позиций не били. 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 - всего одну строчку :
Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы. |
|||||||||||||||
![]() ![]() |
![]() |
© Spyrytus_LTD© 2003 - 2006 гг. |
![]() ![]() |