说起来N皇后啊,这是我递归或者说dfs的入门题啊,还要加上一个汉罗塔,这两道题很经典,大家学dfs或者递归的时候好好去研究研究,对于你理解递归有很大的帮助。
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
第二道题只不过将求几个象棋下法改为让你描绘出图像,没什么区别的,题目最大值n是9,递归暴力跑一下时间也不会超时,但我有个疑问为啥我在本地和在leetcode里面跑的时候程序都好好的,但是提交之后就一直显示各种报错,没办法我就找了个官方题解交了,甚是不理解,没事只要咱们懂原理就行了,下面是我本地跑的代码,大家可以参考
#include <stdio.h>
#include<math.h>
#include<string.h>
#define num 3
static int flag=0;
static int row[10],column[10];
void dfs(int i,int n)
{
if(i==n+1)
{
flag++;
return;
}
int p,q;
//printf("%d\n",i);
for(int j=1;j<=n;j++)
{
for(int k=1;k<=i;k++)
{
// printf("k=%d\n",k);
p=fabs(i-k);
q=fabs(j-column[k]);
if(p==q)
{
break;
}
if(row[j]==0&&k==i)
{
row[j]=1;
column[i]=j;
dfs(i+1,n);
row[j]=0;
column[i]=0;
}
}
}
return;
}
int totalNQueens(int n){
memset(row,0,sizeof(row));
memset(column,0,sizeof(column));
dfs(1,n);
return flag;
}
int main()
{
printf("%d",totalNQueens(num));
return 0;
}