N皇后问题
题目描述
在一个国际棋盘上,放置n个皇后(n<10),使她们相互之间不能进攻。求出所有布局方案及方案数。
输入格式
一行:n
输出格式
每行输出一种方案,每种方案顺序输出皇后所在的列号,各数之间用空格隔开。
(按字典顺序输出)
最后一行输出方案总数。
如果无解则输出“no solute!”
样例 #1
样例输入 #1
4
样例输出 #1
2 4 1 3
3 1 4 2
2
解题思路
把这个棋盘想象成一个平面,对于三种情况:同行,同正对角线,同副对角线。排掉,搜一下应该就可以了。直接看代码吧,上面讲的挺详细的。。。
代码展示
#include <bits/stdc++.h>
using namespace std;
int n,l[15],ans=0;//l是行
bool check(int step,int p){
bool f=true;
for(int i=1;i<=step;i++){
if(l[i]==p||abs(l[i]-p)==abs(step-i))//类似于等腰直角三角形相邻直角边相等:l和p是列,step和i是行
f=false;
}
return f;
}//检查是否可行
void dfs(int step){
if(step>n){
for(int i=1;i<=n;i++)
cout<<l[i]<<" ";
cout<<endl;
ans++;//记录可行的组数
}//超出边界输出
for(int i=1;i<=n;i++){
if(check(step,i)){
l[step]=i;//符合条件压入数组中
dfs(step+1);//搜索右孩子
l[step]=0;//状态还原
}
}
}//搜索所有可能
int main(){
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;
}