问题描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
在这里插入图片描述
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的方案数。
示例1:
输入: 4
输出: 2
示例2:
输入: 8
输出: 92
解题思路
本题可用DFS来解决。
下面以4皇后问题为例:
本题可以用DFS来确定每一个皇后的位置,一行一行排,那么第n个皇后就排在第n行。第n个皇后能在第n行的1->n列选择一个位置。
需要注意的是:每个皇后(注意是每一个!)都不能在同一列,也不能在同一对角线。
那么如何保证这两点呢?首先,保证所有皇后不在同一列很好办,只要每次判断一下之前的皇后是否已经“占据”了这一列即可。其次,要保证不在同一对角线,棋盘其实就是矩阵,每一个位置都是一个坐标,我们可以通过横纵坐标之差来判断是否在同一对角线上。如果两个皇后横坐标之差的绝对值等于纵坐标之差的绝对值,那么这两个皇后就在同一对角线上。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int lie[1005];
int ct=0;
void DFS(int x,int y);//表示 第x个皇后此时在第x行y列
int main()
{
scanf("%d",&n);
DFS(0,0);
printf("%d",ct);
}
void DFS(int x,int y)//表示 第x个皇后此时在第x行y列
{
if(x==n)
{
ct++;
return;//别忘记回溯
}
for(int i=1;i<=n;i++)
{
if(x+1==1)
{
lie[x+1]=i;
DFS(x+1,i);
}
else
{
int j;
for(j=x;j>=1;j--)
{
lie[x+1]=i;//别忘记
if(abs(x+1 - j)==abs(lie[x+1] - lie[j])||lie[x+1]==lie[j])
break;
}
if(j==0)
{
DFS(x+1,i);
}
}
}
}