N皇后问题 - 解法三
import java.util.*;
public class Solution {
private int res;
public int Nqueen (int n) {
res = 0;
//下标为行号,元素为列号,记录皇后位置
int[] pos = new int[n];
Arrays.fill(pos, 0);
//递归
recursion(n, 0, pos);
return res;
}
//递归查找皇后种类
public void recursion(int n, int row, int[] pos) {
//完成全部行都选择了位置
if (row == n) {
res++;
return;
//return后次轮递归结束,自动返回上层迭代,row-1
}
//遍历所有列
for (int i = 0; i < n; i++) {
//检查该位置是否符合条件
if (isValid(pos, row, i)) {
//加入位置
pos[row] = i;
//递归继续查找
recursion(n, row + 1, pos);
//因为siValid每次判断的时候只判断row之前的行,
//每次迭代之后,row自动减一,所以这里不用回溯pos
}
}
//结束条件是,当经过几轮递归和回溯,row0 从 0分支 切换到 n分支 , row1和row2遍历之后回溯,row0轮迭代的i=n循环结束,row0轮(第一轮迭代)退出,程序结束
}
//判断皇后是否符合条件
public boolean isValid(int[] pos, int row, int col) {
//遍历所有已经记录的行
for (int i = 0; i < row; i++) {
//不能同行同列同一斜线
if (row == i || col == pos[i] || Math.abs(row - i) == Math.abs(col - pos[i]))
return false;
}
return true;
}
}
20ms
浙公网安备 33010602011771号