题目描述
请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。
给定一个int n,请返回方法数,保证n小于等于10
测试样例:
1
输出:
1
import java.util.*;
public class Queens {
public int sum=0;
public int nQueens(int n) {
sum=0;
int[] cols=new int[n];
helper(cols,n,0);
return sum;
}
//n是总行数,row是已经探测到的行数,cols是一个竖列数组,下标是row,值是column的值
private void helper(int[] cols, int n, int row){
if(row==n){//走到这一步的都成功了
sum++;
return;
}
for(int i=0;i<n;i++){//这种做法很像是求字符串的全排列
if(isValid(cols,row,i)){//如果没有valid将会退出,不会继续下去,这条线也就是断了
cols[row]=i;
helper(cols,n,row+1);
}else
continue;
}
}
private boolean isValid(int[] cols, int row, int col){//可以放置
for(int i=0;i<row;i++){
if(cols[i]==col){//不能有同列的,同行的不会,因为是row+1来遍历的
return false;
}
if((row-i)==Math.abs(cols[i]-col)){//不能对角线
return false;
}
}
return true;
}
}