В таком виде пойдет?
| Код |
//---------------------------------------------------------------------------
#pragma hdrstop
//--------------------------------------------------------------------------- #include "stdio.h" #include"conio.h" #include "stdlib.h" #pragma argsused
unsigned char F[5]; //Pozicii Ferzej typedef unsigned char doska[8]; // 8 x 8 BITOV (dlja ekonomii vycheslenij :))
doska D, // doska dlja proverki bityx polej D1; // doska dlja razmeshenija ferzej
void Clear (doska d) // ochishenie {d[1]=d[2]=d[3]=d[4]=d[5]=d[6]=d[7]=d[8]=0; } void Print (doska d) //otobrazhenie doski na monitore { unsigned char i,j;
for (i=8; i>0; i--) //obratnyj otschet dlja pravil'nogo izobrazhenija doski { for (j=0; j<8; j++) { printf ("%d ", (d[i]>>j)&1); } //pobitno otobrazhaet dosku printf ("\n"); } printf ("\n"); } void Mark (doska d, unsigned char f) //procedura opredelenija bityx polej {unsigned char i, d1, d2, // znachenija dlja diagonali px=1 <<(f & 7), // Znachenie (koordinata) po Horintali py=1+(f >> 3); // Koordinata po Vertikali
if (f<64) // Esli na doske to Metit' { d[py]|=255; // Sled po Horizontali
for (i=1; i<=8; i++) {d[i]|=px;} //Sled po Vertikali
d1=d2=px; for (i=py-1; i>=1; i--) {d1>>=1; d2<<=1; d[i]|=d2|d1; } //Sled po Diagonaljam vniz
d1=d2=px; for (i=py+1; i<=8; i++) {d1>>=1; d2<<=1; d[i]|=d2|d1; } //Sled po Diagonaljam vverx } }
int main(int argc, char* argv[]) {int u=0; unsigned char i;
for (F[1]=0; F[1]<60; F[1]++) { for (F[2]=F[1]+1; F[2]<61; F[2]++) { for (F[3]=F[2]+1; F[3]<62; F[3]++) { for (F[4]=F[3]+1; F[4]<63; F[4]++) { for (F[5]=F[4]+1; F[5]<64; F[5]++) { Clear (D); // Chistim dosku Mark (D,F[1]); Mark (D,F[2]); Mark (D,F[3]); // Metim bitye polja na doske D Mark (D,F[4]); Mark (D,F[5]);
// Proverjaem summu vsex polej : if (D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]+D[8]==255*8) //Esli vse Bity Doski ustanovleny, to {u++; // Uvelichivaem schetchik Clear (D1); //ochishaem dosku Ferzej for (i=1; i<=5; i++) D1[1+(F[i]>>3)]|=(1<<(F[i] & 7)); //Rasstavljaem Ferzej // 1+(F[i]>>3 - opredeljaet poziciju po vertikali // 1<<(F[i] & 7) - opredeljaet mestonaxozhdenioe po gorizontali
Print (D1); // otobrazhenie }
}}}}}
printf ("%d",u); getch();
return 0; } //---------------------------------------------------------------------------
|
Решил подробнее остановится на этом фрагменте:
| Код | px=1 <<(f & 7), // Znachenie (koordinata) po Horintali py=1+(f >> 3); // Koordinata po Vertikali
|
Допустим у нас ферзь стоит на 20-м (E3) поле:
ето 3 поле по вертикали : 1+(20>>3) = 3 (D[3]) и 5 поле по горизонтали: 1 <<(20 & 7) = 16 или двоичном: 0001 0000, (пятый [по номеру] бит).
значит его положение на битовой доске D[3]=16;
Надеюсь, всё понятно. Если нет, спрашивай ...
|