题目描述
编写一个函数,求解皇后问题:在 n×nn \times nn×n 的方格棋盘上,放置 nnn 个皇后,要求每个皇后不同行、不同列、不同左右对角线。
要求:
1、皇后的个数由用户输入,其值不超过 202020,输出所有的解。
2、采用递归回溯的方法解决。
输入
输入一个整数 nnn,代表棋盘的大小,
输出
将计算出的彼此不受攻击的 nnn 个皇后的所有放置方案输出,每种方案占一行。
输入输出样例
样例输入 #1
复制
4
样例输出 #1
复制
2 4 1 3
3 1 4 2
提示
1、规定搜索时每行从左向右,每列从上往下搜索!
2、尽量采用较优算法!
3、使用递归求解!
#include<bits/stdc++.h>
using namespace std;
int compare(int ans[],int k)
{
int i;
for(i=1;i<k;i++)
{
if(ans[i]==ans[k]||fabs(i-k)==fabs(ans[i]-ans[k]))//如果列相等或者在同一对角线
return 0;
}
return 1;
}
void prin(int ans[],int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(ans[i]==j)
printf("%d ",j);
}
}
printf("\n");
}
void queen(int ans[],int n)
{
int num=1;
ans[num]=0;//列数先赋为0;进入循环就++;
while(num>0)
{
ans[num]++;
while(ans[num]<=n&&compare(ans,num)==0)//如果列数小于n,并且列不满足条件
ans[num]++;//换下一行
if(ans[num]<=n)//如果列数小于n;
{
if(num==n)//如果行数等于n就有一个解;
prin(ans,n);//输出
else//小于n
{
num++;//换下一行
ans[num]=0;//下一行从1开始,后面会++;
}
}
else//列数大于n返回上一行
num--;
}
}
int main()
{
int n;
cin>>n;
int ans[n];
queen(ans,n);
return 0;
}