递归解决八皇后问题

    xiaoxiao2023-09-30  182

    如下

    public class HANNUOTA { static int num=0; public static void main(String[] args) { int n=3; int[][]queen=new int[8][8]; eight_queen(queen,0); } static void eight_queen(int[][]queen,int m){//queen数组寻找第m-1行的皇后位置 if(m>=8){ num++; show(queen); System.out.println("---------------"+num); return; } else{ for(int i=0;i<queen[m].length;i++){ if(_judge(m,i,queen)){ queen[m][i]=1; eight_queen(queen,m+1); queen[m][i]=0;//递归的重点,复位上个递归栈的数组 } } } } static void show(int[][]a){//输出数组 for(int i=0;i<a.length;i++){ for(int j=0;j<a[i].length;j++){ System.out.print(a[i][j]+" "); } System.out.println(); } } static boolean _judge(int i,int j,int[][]queen){判断该点是否可以满足条件 for(int ii=0;ii<queen.length;ii++){ for(int jj=0;jj<queen[ii].length;jj++){ if(((ii-i)==(jj-j)||(ii-i)==(j-jj))&&(queen[ii][jj]==1)) return false; else if((ii==i||jj==j)&&queen[ii][jj]==1) return false; } } return true; } }

    重点就是将递归栈中的皇后数组复位的queen[m][i]=0语句。

    注意,在递归中非引用变量是不需要主动复位的,在返回上递归栈时会自动复位。(所谓的非引用变量可以理解为C语言中的传值,而引用变量是传址。

    最新回复(0)