数据结构与算法 - 递归回溯(迷宫问题)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法 - 递归回溯(迷宫问题)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
遞歸的概念
簡單說就是方法自己調(diào)用自己,每次調(diào)用時傳入不同的變量,遞歸有助于編程者解決復(fù)雜的問題,同時可以讓代碼簡介
遞歸的調(diào)用機(jī)制
遞歸能解決什么問題
遞歸需要遵守的重要規(guī)則
下面用代碼來實(shí)現(xiàn)一個迷宮問題
主要代碼(這里用到了回溯,也就是在if(setWay()))假如是先想下走了,這里開辟個新棧運(yùn)行setWay如果上下左右都走不通,會把當(dāng)前坐標(biāo)設(shè)置成3,然后回到上一個坐標(biāo)的程序里,繼續(xù)向別的方向執(zhí)行)
public static boolean setWay(int[][] map, int i, int j){if (map[6][5] == 2){ // 說明通路找到return true;} else {if (map[i][j] == 0){//如果當(dāng)前點(diǎn)沒有走過//按照策略走 下->右->上->左map[i][j] = 2; //假定可以走通,先設(shè)置成2,不能的話要回溯if (setWay(map,i+1,j)){ //向下走,i會加1return true;}else if(setWay(map,i,j+1)){ //向右走return true;}else if(setWay(map,i-1,j)){//向上走return true;}else if (setWay(map,i,j-1)){//向左走return true;}else {//說明該點(diǎn)走不通,map[i][j] = 3;return false;}} else { //如果map[i][j] !=0, 可能是1,2,3return false;}}}全部代碼
package recursion;/*** 遞歸 迷宮問題*/ public class MiGong {public static void main(String[] args) {//創(chuàng)建一個二維數(shù)組模擬迷宮//地圖int [][] map = new int[8][7];//使用 1 表示強(qiáng)//先把上下全部置位1for (int i = 0; i < 7; i++){map[0][i] = 1;map[7][i] = 1;}//左右置為1for (int i = 0; i < 8; i++){map[i][0] = 1;map[i][6] = 1;}//設(shè)置擋板map[3][1] = 1;map[3][2] = 1;System.out.println("地圖:");for (int i = 0; i < 8; i++){for (int j = 0; j < 7; j++){System.out.print(map[i][j]);System.out.print(" ");}System.out.println("");}//使用遞歸回溯找路setWay(map,1,1);//輸出新的地圖System.out.println("新地圖:");for (int i = 0; i < 8; i++){for (int j = 0; j < 7; j++){System.out.print(map[i][j]);System.out.print(" ");}System.out.println("");}}//使用遞歸回溯給小球找路//說明:// 1. map表示地圖// 2. i,j表示地圖的出發(fā)點(diǎn)(1,1)// 3. 如果小球能到map[6][5],這說明桐廬找到// 4. 約定,當(dāng)?shù)貓Dmap[i][j]:為0時,表示該點(diǎn)沒有走過,當(dāng)為1時表示強(qiáng),為2表示通路可以走,為3表示該點(diǎn)已經(jīng)走過但是走不通// 5.在走迷宮時,需要確定一個策略(方法),下->右->上->左,如果走不通,在回溯/**** @param map 表示地圖* @param i 表示從哪個位置開始找* @param j* @return 找到返回true,沒找到返回false*/public static boolean setWay(int[][] map, int i, int j){if (map[6][5] == 2){ // 說明通路找到return true;} else {if (map[i][j] == 0){//如果當(dāng)前點(diǎn)沒有走過//按照策略走 下->右->上->左map[i][j] = 2; //假定可以走通,先設(shè)置成2,不能的話要回溯if (setWay(map,i+1,j)){ //向下走,i會加1return true;}else if(setWay(map,i,j+1)){ //向右走return true;}else if(setWay(map,i-1,j)){//向上走return true;}else if (setWay(map,i,j-1)){//向左走return true;}else {//說明該點(diǎn)走不通,map[i][j] = 3;return false;}} else { //如果map[i][j] !=0, 可能是1,2,3return false;}}} }總結(jié)
以上是生活随笔為你收集整理的数据结构与算法 - 递归回溯(迷宫问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招行现金分期能取消吗 招行现金分期怎么取
- 下一篇: REVERSE-PRACTICE-CTF