分析
使用二维数组记录访问过的位置:
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
public int res = 0;
public int Nqueen (int n) {
helper(n,0,new boolean[n][n]);
return res;
}
public void helper(int n,int row ,boolean[][] visited) {
if(row == n ) {
res++;
return;
}
for(int j = 0; j < n; j++) {
//判断该位置是否能放置
boolean exist = position(n,row,j,visited);
if(exist == false) {//说明可以放置
visited[row][j] = true;
helper(n,row + 1,visited);
visited[row][j] = false;
}
}
}
public boolean position(int n,int row,int col,boolean[][] visited) {
boolean exist = false;
//判断该列是否有其他皇后
for(int i = 0; i < n; i++) {
exist = exist | visited[i][col];
}
if(exist == true) {
return exist;
}
//判断斜对角线
for(int i = 0; i < n; i++) {
int y_row = i + row - col;
if(y_row >= 0 && y_row < n) {
exist = exist | visited[y_row][i];
}
}
if(exist == true) {
return exist;
}
for(int i = 0; i < n; i++) {
int y_row = -i + row + col;
if(y_row >= 0 && y_row < n) {
exist = exist | visited[y_row][i];
}
}
return exist;
}
}
经过空间优化的代码:
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
public int res = 0;
public int Nqueen (int n) {
int[] visited = new int[n];
Arrays.fill(visited,-1);
helper(n,0,visited);
return res;
}
public void helper(int n,int row ,int[] visited) {
if(row == n ) {
res++;
return;
}
for(int j = 0; j < n; j++) {
//判断该位置是否能放置
boolean exist = position(n,row,j,visited);
if(exist == false) {//说明可以放置
visited[row] = j;
helper(n,row + 1,visited);
visited[row] = -1;
}
}
}
public boolean position(int n,int row,int col,int[] visited) {
//
for(int i = 0; i < n; i++) {
if(col == visited[i]) {
return true;
}
}
//判断斜对角线
for(int i = 0; i < n; i++) {
if(visited[i] < 0) {
continue;
}
if(row - col == i - visited[i]) {
return true;
}
if(row + col == i + visited[i]) {
return true;
}
}
return false;
}
}