一、问题描述
问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法?
不能放皇后的位置及位置之间的关系:
二、代码实现
#include <stdio.h>
int array[20];//数组大小,a[i] = j表示第i个皇后放在第i行的第j个位置
int n,cnt;//n为皇后的个数
int check(int x,int y)//x为行,y为放置的位置
{
int i = 1;
for(;i <= x ;i++)
{
if(array[i] == y)return 0;//前面几行已经在y位置上有元素
if(array[i] + i == x + y)return 0;//上右下左对角线
if(i - array[i] == x-y)return 0;//上左下右对角线
}
return 1;
}
void dfs(int row)//第row个皇后
{
int i,j;
if(row == n+1)//此时已有一个解
{
cnt++;
for(j=1;j<=n;j++)
{
printf("%d ",array[j]);
}
printf("\n");
return ;
}
for(i = 1;i <= n;i++)//从一横排的所有位置开始,判断是否该位置能放皇后
{
if(check(row,i)) //第row个皇后能否放在i位置
{
array[row] = i;
dfs(row+1);//接着放下一个
array[row] = 0;//回溯
}
}
}
void main()
{
scanf("%d",&n);
dfs(1);
printf("%d个皇后一共有%d个解",n,cnt);
}
三、运行结果
四、总结
主要是要搞清楚不能放的位置之间的数字关系