以前曾经接触过N皇后问题,太久没有做了,再次遇到时,在判断是否可以在该位置放置皇后出现了点小问题导致超时了,所以复习一下。
N皇后问题:
题目描述
请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。
给定一个int n,请返回方法数,保证n小于等于15
测试样例:
1
返回:1
class Queens {
public:
int ans = 0;
int n = 0;
int nQueens(int n) {
// write code here
//表示第n行放置的皇后在第几列,0代表还没有放置
vector<int> vis(n + 1, 0);
this ->n = n;
dfs(vis, 1);
return ans;
}
//vis用来判断,cnt代表本次需要放置第几行的皇后
void dfs(vector<int> &vis, int cnt)
{
if(cnt > n)
{
ans++;
return;
}
//遍历判断可以放在哪一列,i代表列
for(int i = 1; i <= n; ++i)
{
int flag = 1;
//遍历之前放置的所有皇后,判断是否满足条件,j代表行
for(int j = 1; j < cnt; j++)
{
//判断条件,是否同列 和 是否在同一对角斜线上(每次行列都变化1就在对角斜线上)(+1,+1)(+1,-1)
//cnt - j肯定大于0,但是i - vis[j]不一定大于0,所以要判断两次
if(vis[j] == i || i - vis[j] == cnt - j || vis[j] - i == cnt - j)
{
flag = 0;
break;
}
}
if(!flag)
continue;
vis[cnt] = i;
//递归求解
dfs(vis, cnt + 1);
}
}
};