递归经典例题之八皇后&汉诺塔

public class EightQueen {
private static int count=0; //记录第几种可能
public static void main(String[] args) {
int[][] arr=new int[8][8]; //默认元素为0 1当皇后
eightQueen(0,arr); //打印八皇后所有可能的解 并且从第一行开始 0
}
//row [0,7]
private static void eightQueen(int row, int[][] arr) {
if(row==8){
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【8】【8】;
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<8;col++){//判断的时候,遍历当前行的列位置,即列数++
if(Safe(row,col,newArr)){//如果可以放,就把这一行其他的元素都清零,然后把安全的位置放1;
for(int c=0;c<8;c++){
newArr[row][c]=0;
}
newArr[row][col]=1;
eightQueen(row+1, newArr);
//再继续验证下一行,递归调用eightQueen(),给row+1;
}
}
}
}
private static boolean Safe(int row, int col, int[][] newArr) {
//正上,行–,列不变
for(int r=row-1;r>=0;r–){ //跟当前行的上面比,即从row-1开始,r–;列不变,行变
if(newArr[r][col]==1){
return false;
}
}
//左上:行–,列–
for(int r=row-1,c=col-1;r>=0&&c>=0;r–,c–){
if(newArr[r][c]==1){
return false;
}
}
//右上:行–,列++
for(int r=row-1,c=col+1;r>=0&&c<8;r–,c++){
if(newArr[r][c]==1){
return false;
}
}
return true;
}
}
思路:1.最重要的是每次判断的时候需要对上一个数组进行备份,然后以上一行的结果为newArr ,再进行判断,一旦找到安全位置,就给该行所有元素清零,再给安全位置放上皇后;
2.再对新数据备份,进行下一行判断。即递归调用eightQueen(row+1,newArr);
直到打印出所有可能性。
3.其中,判断安全位置主要就是判断三个方向: 正上,左上,右上。每次都跟当前行的前几行对比。

猜你喜欢

转载自blog.csdn.net/zhangpupu320/article/details/89058073