Задача о восьми ферзях на СИ
Рубрика: Программирование
Недавно надо было решить задачу о восьми ферзях на шахматной доске (стандартная задача физ-мата). Может кому пригодится, выложу.
В задаче реализованы 3 функции, проверки ячейки, вывода поля и собственно главная функция. Всё написано на чистом СИ. Задача выводит 92 варианта расстановки ферзей. Если что непонятно, спрашивайте =).
#include <stdio.h>
#include <stdlib.h>
#define MAXPOLE 8
int pole[MAXPOLE];
int count=0;bool check(int beg)
{
bool res=true;
if (beg>=1)
{
int i=0;
while (res && (i<beg))
{
if (pole[i] == pole[beg]) res=false;
if (abs(pole[beg]-pole[i]) == abs(beg-i)) res=false;
i++;
}
}
return res;
}void print(int beg)
{
printf(“———– %02d ————\n”,count);
printf(“ A B C D E F G H \n”);
for(int y=0; y<beg; y++)
{
printf(“%d “,y+1);
for(int x=0; x<MAXPOLE; x++)
{
if (x== pole[y]) printf(” F “);
else printf(” * “);
}
printf(“\n”);
}
printf(“—————————\n”);
}
int main()
{
int beg=0;
pole[beg]=-1;
while (beg>=0)
{
pole[beg]++;
if (pole[beg] == MAXPOLE) beg–;
else
{
if (check(beg))
{
beg++;
if (beg==MAXPOLE)
{
count++;
print(MAXPOLE);
beg–;
}
else pole[beg]=-1;
}
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAXPOLE 8
int pole[MAXPOLE];
int count=0;
bool check(int beg)
{
bool res=true;
if (beg>=1)
{
int i=0;
while (res && (i<beg))
{
if (pole[i] == pole[beg]) res=false;
if (abs(pole[beg]-pole[i]) == abs(beg-i)) res=false;
i++;
}
}
return res;
}
void print(int beg)
{
printf(“———– %02d ————\n”,count);
printf(“ A B C D E F G H \n”);
for(int y=0; y<beg; y++)
{
printf(“%d “,y+1);
for(int x=0; x<MAXPOLE; x++)
{
if (x== pole[y]) printf(” F “);
else printf(” * “);
}
printf(“\n”);
}
printf(“—————————\n”);
}
int main()
{
int beg=0;
pole[beg]=-1;
while (beg>=0)
{
pole[beg]++;
if (pole[beg] == MAXPOLE) beg–;
else
{
if (check(beg))
{
beg++;
if (beg==MAXPOLE)
{
count++;
print(MAXPOLE);
beg–;
}
else pole[beg]=-1;
}
}
}
return 0;
}
Ноя16