这题我用的是搜索与回溯
先看题目
题目描述
在一个nXn的国际象棋棋盘上放置n(n<=12)个皇后,使它们不能互相攻击(即任意两个皇后不能在同一行、同一列或同一对角线上)。试求出所有方法。
输入 输出
输入一个数n .(n<=12) 输出所有的排列方案总数。
样例输入 样例输出
4 2
看完题就要有一个思路(如图)
1.可以用二维数组来记录皇后的位置,x既可以是已放置皇后数也可以是第x行。
2.判断放置是否合理。
3.放置皇后并记录所在列,对角线。
#include<cstdio>
using namespace std;
int n,a[14][14],sum,l[14],dui1[500],dui2[500];//l[]是列 dui1[]dui2[]是对角线
void dfs(int x)
{
if(x>n)
{
sum++;
return;
}
for(int i=1;i<=n;i++)
{
if(l[i]==0&&dui1[x-i+n]==0&&dui2[x+i]==0)//判断能否放置皇后
{
a[x][i]=1;l[i]=1;dui1[x-i+n]=1;dui2[x+i]=1;//放置后记录一下所在列,对角线。
dfs(x+1);//搜索
a[x][i]=0;l[i]=0;dui1[x-i+n]=0;dui2[x+i]=0;//回溯
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
printf("%d",sum);
return 0;
}
点个赞呗 😉