按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
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
- #include
- #include
- #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;
- }