要想解決迷宮問題,首先搞明白八皇后,迷宮問題是回溯和貪心的產物。
題目:現有乙個迷宮如圖:
黃色五角星為迷宮的起點,紅色五角星為迷宮的終點。
要求:找到從起點到終點的所有路線。
思路:我們的目的為了到達終點,所以一定要向著終點的方向出發。
因為迷宮的終點在起點的右下角。
所以我們選擇路徑時先考慮向下走,
走不通考慮向右走,
走不通考慮向上,
最後考慮向左。
這樣就會總有一次到達終點。
思路
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 迷宮...