详细见:leetcode.com/problems/n-queens-ii
Java Solution: github
package leetcode;
public class P052_NQueensII {
public static void main(String[] args) {
System.out.println(new Solution1().totalNQueens(8));
}
/*
* 2 ms
* 80.45%
*/
static class Solution1 {
int ans = 0;
boolean[] col = null, rup = null, lup = null;
public int totalNQueens(int n) {
if (n < 1)
return ans;
col = new boolean[n];
rup = new boolean[(n << 1) - 1];
lup = new boolean[rup.length];
search(0);
return ans;
}
private void search(int index) {
if (index == col.length) {
ans ++;
return;
}
for (int i = 0; i != col.length; i ++) {
if (! col[i] && ! lup[index + i] && ! rup[col.length - 1 + index - i]) {
col[i] = lup[index + i] = rup[col.length - 1 + index - i] = true;
search(index + 1);
col[i] = lup[index + i] = rup[col.length - 1 + index - i] = false;
}
}
}
}
}
C Solution: github
/*
url: leetcode.com/problems/n-queens-ii/
AC 6ms 0.00%
AC 3ms 7.14%
*/
#include <stdio.h>
#include <stdlib.h>
int valid(char** save, int i, int j, int n) {
int k = 0, ii = 0, jj = 0;
for (k = 0; k < n; k ++) {
if (k != i && save[k][j] == 'Q') return 0;
if (k != j && save[i][k] == 'Q') return 0;
}
ii = i + 1;
jj = j + 1;
while (ii < n && jj < n) {
if (save[ii][jj] != 'Q') {
ii ++;
jj ++;
} else return 0;
}
ii = i - 1;
jj = j - 1;
while (ii > -1 && jj > -1) {
if (save[ii][jj] != 'Q') {
ii --;
jj --;
} else return 0;
}
ii = i + 1;
jj = j - 1;
while (ii < n && jj > -1) {
if (save[ii][jj] != 'Q') {
ii ++;
jj --;
} else return 0;
}
ii = i - 1;
jj = j + 1;
while (ii > -1 && jj < n) {
if (save[ii][jj] != 'Q') {
ii --;
jj ++;
} else return 0;
}
return 1;
}
void solve(char** save, int row, int n, int* ans) {
int i = 0, j = 0, col = 0;
if (row == n) {
(*ans) ++;
return;
}
for (col = 0; col < n; col ++) {
if (valid(save, row, col, n)) {
save[row][col] = 'Q';
solve(save, row+1, n, ans);
save[row][col] = '.';
}
}
}
int totalNQueens(int n) {
char** save = (char**) malloc(sizeof(char*) * n);
char* save_row = NULL;
int i = 0, j = 0, ans = 0;
for (i = 0; i < n; i ++) {
save_row = (char*) malloc(sizeof(char) * (n+1));
for (j = 0; j < n; j ++) save_row[j] = '.';
save_row[n] = '\0';
save[i] = save_row;
}
solve(save, 0, n, &ans);
return ans;
}
void solve2(int row, int n, int* ans, int* col_sign, int* lup_sign, int* rup_sign) {
int col = 0;
if (row == n) {
(*ans) ++;
return;
}
for (col = 0; col < n; col ++) {
if (!col_sign[col] && !lup_sign[row + col] && !rup_sign[col - row + n - 1]) {
col_sign[col] = lup_sign[row + col] = rup_sign[col - row + n - 1] = 1;
solve2(row+1, n, ans, col_sign, lup_sign, rup_sign);
col_sign[col] = lup_sign[row + col] = rup_sign[col - row + n - 1] = 0;
}
}
}
int totalNQueens2(int n) {
int i = 0, j = 0, ans = 0;
int *col_sign = NULL, *lup_sign = NULL, *rup_sign = NULL;
col_sign = (int*) malloc(sizeof(int) * n);
lup_sign = (int*) malloc(sizeof(int) * (2 * n - 1));
rup_sign = (int*) malloc(sizeof(int) * (2 * n - 1));
for (i = 0; i < n; i ++) col_sign[i] = 0;
for (i = 0; i < 2 * n - 1; i ++) lup_sign[i] = 0;
for (i = 0; i < 2 * n - 1; i ++) rup_sign[i] = 0;
solve2(0, n, &ans, col_sign, lup_sign, rup_sign);
return ans;
}
int main() {
printf("answer is %d\r\n", totalNQueens2(14));
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/n-queens-ii
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月10日
@details: Solution: 66ms 84.62%
'''
class Solution(object):
def search(self, a, c, l, r, i, n):
if i == n:
a[0] += 1
return
for j in range(n):
if not c[j] and not l[j+i] and not r[j-i+n-1]:
c[j]=l[j+i]=r[j-i+n-1]=True
self.search(a, c, l, r, i+1, n)
c[j]=l[j+i]=r[j-i+n-1]=False
def totalNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
a,c,l,r=[0],[False]*n,[False]*(2*n-1),[False]*(2*n-1)
self.search(a, c, l, r, 0, n)
return a[0]
if __name__ == "__main__":
print(Solution().totalNQueens(5))