packagecom.serein.recursion;/*** @author baichuan* @version 1.0*/publicclassMiGong{publicstaticvoidmain(String[] args){//定義一個二維數組表示迷宮int[][] map =newint[11][10];//初始化這個迷宮,1表示墻for(int i =0; i <11; i++){map[i][0]=1;map[i][9]=1;}for(int i =0; i <10; i++){map[0][i]=1;map[10][i]=1;}//設置障礙map[4][1]=1;map[4][2]=1;map[4][3]=1;map[3][3]=1;map[2][3]=1;map[2][2]=1;//看迷宮效果for(int i =0; i <11; i++){for(int j =0; j <10; j++){System.out.print(map[i][j]+" ");}System.out.println();}//開始走迷宮setWay(map,1,1);System.out.println("遞歸算法計算后的迷宮,看通路:");for(int i =0; i <11; i++){for(int j =0; j <10; j++){System.out.print(map[i][j]+" ");}System.out.println();}}//走迷宮方法//約定1:轉態0:沒走過 狀態1:墻 狀態2:通路 狀態3:走過證明是死路不能再走。//約定2.走迷宮的策略為:下->右->上->左,走不通則回溯//約定3.小球起點[1][2],終點[9][8]publicstaticbooleansetWay(int[][] point,int i,int j){if(point[9][8]==2){//走到終點了,通路形成returntrue;}else{//沒到終點,業務邏輯if(point[i][j]==0){//如果這一點還沒有走過//先默認這一點是通路point[i][j]=2;if(setWay(point, i +1, j)){returntrue;//向右走}elseif(setWay(point, i, j +1)){returntrue;//向下走}elseif(setWay(point, i -1, j)){returntrue;//向上走}elseif(setWay(point, i, j -1)){returntrue;//向左走}else{//在這一點上下左右均不可走,說明是死地,這一點不能走point[i][j]=3;returnfalse;}}else{//r若不是0,那么1,3是不能走的,2已經走過也沒必要重復returnfalse;}}}}
測試截圖
八皇后問題 ??用一維數組模擬八皇后的擺法。認為數組的下標代表行數。
packagecom.serein.recursion;/*** @author baichuan* @version 1.0*/publicclassQueen8{int max =8;int[] arr =newint[max];staticint count =0;staticint judgeCount =0;publicstaticvoidmain(String[] args){Queen8 queen8 =newQueen8();queen8.check(0);System.out.println("一共有 "+ count +" 種解法");System.out.println("一共判斷沖突的次數為 "+ judgeCount +" 次");}//放第n個皇后privatevoidcheck(int n){if(n == max){//8個皇后都已經放好print();return;}//開始放皇后for(int i =0; i < max; i++){//先把這個皇后放到這一行的第1列arr[n]= i;//看這個位置是否有沖突if(judge(n)){//不沖突,那么接著放下一個皇后check(n +1);}//若沖突,會繼續走arr[n] = i的邏輯,就是把這個皇后 放到本行的 剛才放的那個位置的后一個位置}}//檢查看當前皇后和前面已經擺好的皇后位置是否沖突//n表示第幾個皇后privatebooleanjudge(int n){judgeCount++;for(int i =0; i < n; i++){//arr[i] == arr[n]判斷第n個皇后是否和前面的第n-1 個皇后在同一列//Math.abs(n - i) == Math.abs(arr[n] - arr[i])判斷換后中是否有在同一斜線上//不必判斷是否在同一行,因為n即代表是第幾個皇后,也代表第幾行,是遞增的,不會重復if(arr[i]== arr[n]||Math.abs(n - i)==Math.abs(arr[n]- arr[i])){returnfalse;}}returntrue;}//把得到的結果輸出privatevoidprint(){count++;for(int i =0; i < arr.length; i++){System.out.print(arr[i]+" ");}System.out.println();}}