|
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 гг. |
|