迷宮(回溯演算法)

2021-08-08 23:59:30 字數 2080 閱讀 2756

要想解決迷宮問題,首先搞明白八皇后,迷宮問題是回溯和貪心的產物。

題目:現有乙個迷宮如圖:

黃色五角星為迷宮的起點,紅色五角星為迷宮的終點。

要求:找到從起點到終點的所有路線。

思路:我們的目的為了到達終點,所以一定要向著終點的方向出發。

因為迷宮的終點在起點的右下角。

所以我們選擇路徑時先考慮向下走,

走不通考慮向右走,

走不通考慮向上,

最後考慮向左。

這樣就會總有一次到達終點。

思路

1、將「小人」放到起點。

2、判斷這個方向是否能走,(起始方向向下)

(1)如果能走,走這條路,並記錄這條路已經被走過了

(2)如果不能走,

(a)換個方向,重複步驟 2。如果4個方向都不能走,退回上一步的位置,擦掉這條路被走過的記錄,並重複步驟2。

3、如果下一步的座標是終點座標,說明一條路徑已經誕生了。輸出這條路徑。並退回上一步,重複步驟2中的(a),繼續探索下一條路徑。

思考

什麼時候「小人」將所有路徑走完?

「小人」將起點向上開始走到終點的路徑都走完。(此題的迷宮起點向上和向左是沒有路的,所以應該是「小人」從起點開始向右走過的路徑都走完)

演算法實現

首先宣告乙個陣列用來儲存方向:

int move[4][2] = , , ,  };//分別代表向下、向右、向上、向左
maze[9][10];
為了記錄走過的路:定義乙個迷宮副本:

copymaze[9][10];
記錄路線(每一步的座標):

way[100][2] =  };//用來儲存路線(將起點座標新增進去)
約定:

迷宮陣列中:

牆為0、路為-1。

具體實現方法:

#include

#include

#include

int maze[9][10] = ;

int move[4][2] = , , , };//分別代表向下、向右、向上、向左

int way[100][2] = };//用來儲存路線(將起點座標新增進去)

int copymaze[9][10] = ;//用來記錄走過的路

int top = 0;//用來記錄步數,並用來指向最後一步的座標

int count = 0;//用來統計有多少種走法

//製作迷宮路線

void makeamap()

//將路徑新增到迷宮中

void addway()

}//在迷宮刪除上一條路徑

void delway()

}//列印迷宮

void printmap()

else

if (maze[i][j] == -1)

else

}printf("\n");

}printf("\n\n");

delway();

}void maze(int x, int y)

else

//回到上一步,並擦除這一步的痕跡

top--;

copymaze[a][b] = 0;}}

}int main(void)

除錯結果:

這個迷宮一共有56種走法:

第1種:

第56種:

注意第二部的位置,以此驗證思考題。

演算法 迷宮問題 回溯

package datastructure.migong public class test for int i 0 i 8 i map 3 1 1 map 3 2 1 map 3 3 1 setway map,1,1 for int i map system.out.println 判斷當前點能否...

遞迴演算法 迷宮回溯問題

package com.czn.recursion public class migong for int i 0 i 8 i map 3 1 1 map 3 2 1 for int i 0 i 8 i system.out.println boolean setway setway map,1,1...

演算法 回溯法 迷宮問題(殘缺)

includeusing namespace std int path int result int square int dirx 8 8個方向變數 int diry 8 int turn 999 int level 0 int finallevel 0 int dir 步向 int m,n 迷宮...