牛客地址
解题思路
利用boolean[] visited数组加以辅助, 表示第i个位置是否可以放置。
nums[i] 表示第i个皇后放置的列号。
dfs(int[] nums, int cur, int n):将第cur个皇后进行放置
在每次放置前,先遍历之前已经完成放置的cur - 1个皇后。for i = 0 to cur - 1
int v = nums[i];//得到皇后的位置,将visited[v]设置为false, 表示第cur个皇后不能放置在v列。
将和(i, nums[i]) 在同一对角线上的(cur, ?)中的visited[?]设置为false, 如何求?呢? distanceX = cur - i; ? = v + distanceX 或者 ? = v - distanceX
遍历当前行所有可放皇后的位置,进行递归。
实现代码
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
private int count = 0;
public int Nqueen (int n) {
// write code here
int[] nums = new int[n];
backtracking(0, nums);
return count;
}
//放置第k个皇后
public void backtracking(int cur, int[] nums){
int n = nums.length;
if(cur == n){
count ++;
return;
}
boolean [] visited = new boolean[n];
for(int i = 0; i < cur; i++){
int v = nums[i];
visited[v] = true;
int distance = cur - i;
int l = v - distance;
int r = v + distance;
if(l >= 0){
visited[l] = true;
}
if(r < n){
visited[r] = true;
}
}
for(int i = 0; i < n; i++){
if(!visited[i]){
nums[cur] = i;
backtracking(cur + 1, nums);
}
}
}
}