package p03.递归;
//N皇后问题
public class NQueen {
static int count=0;
static int N=4;
public static void main(String[] args) {
int[][] arr=new int[N][N];
NQueen(0,arr); //0代表从第一行开始
}
public static void NQueen(int row, int[][] arr) {
if(row==N){
count++;
System.out.println("第"+count+"种:");
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}else{
//备份数组
int[][] newArr=new int[N][N];
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
newArr[i][j]=arr[i][j];
}
}
for(int col=0;col<N;col++){
if(noDangerous(row,col,newArr)){
//上一种结果可能已经在当前行的某个位置放了1,需将当前行清空
for(int c=0;c<N;c++){
newArr[row][c]=0;
}
//没冲突,将当前位置,置为1
newArr[row][col]=1;
//寻找下一行的不冲突位置
NQueen(row+1, newArr);
}
}
}
}
public static boolean noDangerous(int row, int col, int[][] newArr) {
//当前位置我们只需要去判断,左上,正上以及右上位置,是否有冲突,
//正上
for(int i=row-1;i>=0;i--){
if(newArr[i][col]==1){
return false;
}
}
//左上
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if(newArr[i][j]==1){
return false;
}
}
//右上
for(int i=row-1,j=col+1;i>=0&&j<N;i--,j++){
if(newArr[i][j]==1){
return false;
}
}
return true;
}
}
JAVA数据结构之N皇后(递归)
最新推荐文章于 2022-06-18 19:53:27 发布