使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横
行、纵行或斜线上。
对于八皇后问题,每次放置皇后时都要找到一个合适的位置,我们可以先放第一行,然后从第一列到最后一列每个位置都去尝试,判断在此位置的同一横行,竖行,斜线(有两条)上是否放有其他皇后,若有其他皇后,则在此行的下一个位置尝试,找到合适位置后,在下一行以同样的方式去寻找,当八个皇后全部放置后说明已经找到了一种方式,寻找其他方式时,我们可以先把最后一个皇后(即第八行放置的皇后)回收(取消标记),回到上一个皇后(第七行),向下一个位置尝试,若找到合适位置,则在第八行以同样的方式寻找合适位置,若没有找到合适位置,回收第七行皇后(取消标记),则回到上一个皇后(第六行)以同样的方式进行尝试,直到找到全部的合适位置
#include<stdio.h>
int count=0;
void printf_arr();
int judge(int ,int );
void fun(int);
int arr[8][8]={0}; //二维数组模拟棋盘,初始化为 0
int main()
{
fun(0);
printf("%d\n",count);
return 0;
}
void fun(int n)
{
int i;
if(n==8)
{
count++;
printf_arr();
}
else
for(i=0;i<8;i++)
{
if(judge(n,i)==1) //调用函数找出第n行合适的位置
{
arr[n][i]=1; //若合适 标记为 1
fun(n+1); //进行下一行判断
arr[n][i]=0; // 取消标记 即回收此皇后 进行下一次尝试
}
}
}
int judge(int x,int y) //因为是由上向下遍历,所以只需判断此行上面部分
{
int i,j;
for(i=x;i>=0;i--) //判断此列上方是否存在其他皇后
{
if(arr[i][y]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j>=0;i--,j--) //判断斜线左上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j<8;i--,j++) // 判断斜线右上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
return 1;
}
void printf_arr()
{
int i,j;
for( i=0;i<8;++i) // 输出合适的方法
{
for( j=0;j<8;++j)
printf("%2d", arr[i][j]);
printf("\n");
}
printf("\n");
}