本题是要求n皇后的解法:看起来甚至比N-Queens(求全部的解)还简单,很容易写出下面的代码:
import java.util.*;
public class Solution {
/**
*
* @param n int整型 the n
* @return int整型
*/
//private List<List<String>> rs;
private int cnt;
// 从上往下 一行行排
private void helper(int[] board,int row){
if(row==board.length){
cnt++;
}
for(int i=0;i<board.length;i++){
if(valid(board,row,i)){
board[row]=i;
helper(board,row+1);
}
}
}
private boolean valid(int[] board,int row,int col){
// 因为是从上到下,所以当然不同行
// 首先检查不同列
for(int i=0;i<row;i++){
if(board[i]==col){
return false;
}
}
// 检查对角:
for(int i=0;i<row;i++){
int leftUp=col-(row-i);
int rightUp=col+(row-i);
if(board[i]==leftUp||rightUp==board[i]){
return false;
}
}
return true;
}
public int Nqueen (int n) {
// rs=new ArrayList<>();
helper(new int[n],0);
return cnt;
}
}
上述代码在lc能通过,但是在牛客上不能通过全部的测试用例,只能过87%
搜了一下,发现因为这里不需要求出全部的解,那么可以做一些优化:
class Solution {
private int cnt;
// 分别用来表示当前行,当前主副对角线是否有queen
private boolean[] cols;
private boolean[] dg1;
private boolean[] dg2;
private void heleper(int r){
if(r==cols.length){
cnt++;
return;
}
for(int i=0;i<cols.length;i++){
// 遍历所有的列,并判断(r,i)对应点的同列,同主副对角线是否有摆放queen
// 这里利用到一个性质:所有主对角线上的点的r+c相等(类似x+y=c),所有副对角线上的点的r-c相等(类似y=x+c)
int idg1=r+i;// r+i的取值范围是[0,2n-2]
int idg2=r-i+cols.length;// r-i的取值范围是[1-n,n-1],加一个n就是[1,2*n-1]
if(cols[i]||dg1[idg1]||dg2[idg2]){
continue;
}
cols[i]=dg1[idg1]=dg2[idg2]=true;
heleper(r+1);
// 这里似乎用一个计数来判断才对:因为一个对角线上可能放多个Q
// 但是问题在于,只要放了一个,上面就会continue,所以用boolean即可
cols[i]=dg1[idg1]=dg2[idg2]=false;
}
}
public int totalNQueens(int n) {
cols=new boolean[n];
dg1=new boolean[2*n];
dg2=new boolean[2*n];
heleper(0);
return cnt;
}
}
(刷题因为中间荒废了一段时间 现在还是需要循序渐进 这个思路理解了半天 当然也可能是我状态问题
加油