问题:
N皇后问题是一个经典的问题,描述如下:
在的方格棋盘需要放置N个皇后,使得它们不相互攻击,
即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45度角的斜线上。
对于给定的N,请输出有多少种合法的放置方法。
分析:
最简单的办法就是暴力搜索,遍历所有的情况,并判断是否符合条件。
本人的办法就是,一层一层的向下判断,我在当前层新添加一个皇后时,我只需要判断本一列上面,左上,右上三个方向是否有皇后,没有则进入到下一层的皇后判断。
我的代码:
#include <iostream>
#include<vector>
using namespace std;
int mycount;
int n;
int ok(int row,int col,vector<vector<int> > res) //判断当前位置添加皇后是否可行
{
for(int i=row-1;i>=0;i--)//向上找
{
if(res[i][col]==1)
return 0;
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)//向左上找
{
if(res[i][j]==1)
return 0;
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++) //向右上找
{
if(res[i][j]==1)
return 0;
}
return 1;
}
void dfs(int k,vector<vector<int> >& res)
{
if(k>=n) //当皇后放置完成时,答案计数加一
mycount++;
else
{
for(int i=0;i<n;i++) //当前行的每个位置判断
{
res[k][i]=1;
if(ok(k,i,res)) //当前位置符合就进入下一行
{
dfs(k+1,res);
}
res[k][i]=0; //回溯
}
}
}
int main()
{
cin>>n;
vector<vector<int> > res(n,vector<int>(n,0));
dfs(0,res); //第0层
cout<<mycount;
}