# 52. N-Queens II
題目:<https://leetcode.com/problems/n-queens-ii/>
解法:嘗試一列一列去擺放所有位置,如果發現下一列無法放皇后,就往回上一列嘗試其他位置。
Python3:
``` python 3
class Solution:
def totalNQueens(self, n: int) -> int:
if n == 1:
return 1
def check(x, y):
for i in range(n):
if board[i][y] == 1 or board[x][i] == 1:
return False
for i, j in zip(range(x+1, n), range(y+1, n)):
if board[i][j] == 1:
return False
for i, j in zip(range(x-1, -1, -1), range(y-1, -1, -1)):
if board[i][j] == 1:
return False
for i, j in zip(range(x+1, n), range(y-1, -1, -1)):
if board[i][j] == 1:
return False
for i, j in zip(range(x-1, -1, -1), range(y+1, n)):
if board[i][j] == 1:
return False
return True
def backtrack(x):
nonlocal output
if x == n:
output += 1
return
for y in range(n):
if check(x, y):
board[x][y] = 1
backtrack(x + 1)
board[x][y] = 0
output = 0
board = [[0 for i in range(n)] for j in range(n)]
backtrack(0)
return output
if __name__ == '__main__':
n = 4
ans = Solution().totalNQueens(n)
print(ans)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int totalNQueens(int n) {
if (n == 1)
return 1;
int output = 0;
int board[n][n];
for (int i = 0; i < n; i++)
for (int j = 0; j <n; j++)
board[i][j] = 0;
bool check(int x, int y) {
for(int i = 0; i < n; i++)
if (board[x][i] == 1 || board[i][y] == 1)
return false;
for(int i = 1; x+i < n && y+i < n; i++)
if (board[x+i][y+i] == 1)
return false;
for(int i = 1; x-i >= 0 && y-i >= 0; i++)
if (board[x-i][y-i] == 1)
return false;
for(int i = 1; x+i < n && y-i >= 0; i++)
if (board[x+i][y-i] == 1)
return false;
for(int i = 1; x-i >= 0 && y+i < n; i++)
if (board[x-i][y+i] == 1)
return false;
return true;
}
void backtrack(int x) {
if (x == n) {
output++;
return;
}
for (int y = 0; y < n; y++) {
if (check(x, y)) {
board[x][y] = 1;
backtrack(x + 1);
board[x][y] = 0;
}
}
}
backtrack(0);
return output;
}
int main()
{
int n = 4;
int ans = totalNQueens(n);
printf("%d\n", ans);
return 0;
}
```
###### tags: `leetcode` `backtracking`