#include <iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
const int N=101;
int q[N];//i表示第几个皇后,i表示行 q[i]表示在第几列 牛啊
int i,j,ans,n;
int check(int j)
{
for(int i=1;i<j;i++)
{
if(q[i]==q[j]||abs(i-j)==abs(q[i]-q[j]))//分别是判断是否在同一列 是否在同一斜线
return 0;//任意一个满足 该皇后的位置就不合法
}
return 1;//表示皇后的位置合法
}
void queen(int j)//正在摆放第j个皇后
{
for(int i=1;i<=n;i++) {
q[j]=i;//让列号取到 1 2 3 4 5...n
if(check(j))//皇后的位置合法 //当皇后的位置不合法 就不会进入if的分支 回到for i++
{
if(j==n)//找到了一组解
{
ans++;
cout<<ans;
for(i=1;i<=n;i++)
{
cout<<q[i];
}
cout<<endl;
}
else{
queen(j+1);//位置不合法 就回去摆放下一个皇后的位置
}
}
}
}
int main()
{
cin>>n;
queen(1);
cout<<ans;
return 0;
}
N皇后问题 dfs 回溯
最新推荐文章于 2024-07-24 20:44:05 发布