题目描述
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围: 1≤n≤9
要求:空间复杂度 O(1) ,时间复杂度 O(n!)
例如当输入4时,对应的返回值为2
题目思路
- 这是一道经典的递归+缓存的题目,在递归的过程中通过数组记录之前走过的位置,同时需要我们判断是否满足同行同列同斜率的问题,如果满足,直接返回false,尝试下一个位置,如果不满足,尝试下一个位置,如果最后到了最后一行,记录一种方案+1,否则+0,累加到最后的结果中返回。
- 递归需要注意的点是:递归的结束条件、每层递归返回的值、每层递归需要做的事儿。
题目代码
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
public int Nqueen (int n) {
// write code here
// 边界条件的特殊判断
if (n < 1) {
return 0;
}
//通过一个一维数组来记录之前走过的状态
int[] record = new int[n];
return process(0, record, n);
}
public int process(int i,int[] record,int n){
//递归的出口条件
if(i==n){
return 1;
}
int res=0;
for(int j=0;j<n;j++){
//判断当前的位置是否满足要求
if(isValid(record,i,j)){
//标记当前的位置
record[i]=j;
//继续下一次的递归,将所有的结果累加到变量res上
res+=process(i+1,record,n);
}
}
return res;
}
public boolean isValid(int[] record,int i,int j){
for(int k=0;k<i;k++){
// 不能同行 同列 同斜线
if(record[k]==j||Math.abs(k-i)==Math.abs(j-record[k])){
return false;
}
}
return true;
}
}