您的位置:首页 > 其它

N皇后问题解题报告

2017-11-20 22:28 155 查看
题目描述

在N*N(N<=10)的棋盘上放N个皇后,使得她们不能相互攻击。两个皇后能相互攻击当且仅当它们在同一行,或者同一列,或者同一条对角线上。

找出一共有多少种放置方法。

输入

第一行输入N。

输出

输出方案总数。

样例输入

4

样例输出

2

数据范围限制

N<=10

解题报告:

典型的深搜。

代码:

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<string>

#include<cmath>

#include<ctime>

#include<cctype>

#include<iomanip>

#include<algorithm>

#include<queue>

#include<stack>

#include<map>

#include<set>

#include<vector>

using namespace std;

int n,ans;

int a[100]; //a[i]=j 表示第i行第j列的皇后

bool col[100],obl1[100],obl2[100];//列标记,对角线标记

void dfs(int row)

{
for(int i=1;i<=n;i++)
{
if(!col[i] and !obl1[i+row]&&!obl2[i-row+n])
{
col[i]=obl1[i+row]=obl2[i-row+n]=true;//占领这里
if(row==n)ans++;
else dfs(row+1);
col[i]=obl1[i+row]=obl2[i-row+n]=false;//回溯

}
return ;

}

int main()

{
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;

}
语种:C++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: