深度優先搜尋-求解迷宮解空間
1.原理描述:
給定圖G的初始狀態是所有頂點均未曾訪問過,在G中任選一頂點V為初始出發點(源點、根結點)。
則描述如下:首先訪問出發點V,並將其標記為已訪問過;然後依次從V出發搜尋V的每個鄰接點(子結點)W。
若W未曾訪問過,則以W為新的出發點繼續進行深度優先遍曆,直到圖中所有和源點V有路徑相同的頂點(從源點可達的頂點)均已被訪問為止。若此圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重複上述過程,直到圖中所有頂點均已被訪問為止。
2.演算法描述
(1) 確定圖的儲存方式。
(2) 設計搜尋過程中的操作,其中包括為輸出問題解而進行的儲存操作。
(3) 搜尋到問題的解,則輸出;否則回溯。
(4) 一般在回溯前應該將結點恢複為原始狀態,特別是在多解問題中。
3.一種實現:走迷宮問題。給定入口,求解搜尋到出口的解空間。
public class MiGong{/* * author 隆 */private static int[][] maze = { { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 0, 1, 0 }, { 0, 0, 0, 0, 1, 0, 1, 0 }, { 0, 1, 0, 0, 0, 0, 1, 0 }, { 0, 1, 0, 1, 1, 0, 1, 0 }, { 0, 1, 0, 0, 0, 0, 1, 1 }, { 0, 1, 0, 0, 1, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0 } }; private static int f[][]={{1,-1,0,0},{0,0,1,-1}};private static int total;public static void main(String args[]){int start=0;int end=0;maze[start][end]=3;//標誌這條路已經走過fun(start,end);System.out.println(total);}public static void fun(int p1,int p2){int px;int py;//開始搜尋四個方向for(int i=0;i<4;i++){if(check(p1,p2,i)){//檢車四個方向是否可走px=p1+f[0][i];py=p2+f[1][i];maze[px][py]=3;//標誌這條路已經走過if((px==maze[0].length-1)&&(py==maze.length-1)) out();else fun(px,py);}}maze[p1][p2]=2;//死路}//輸出public static void out(){for(int i=0;i<maze.length;i++){for(int j=0;j<maze[i].length;j++){if(maze[i][j]==3){System.out.print("X");total++;}else System.out.print("*");}System.out.println();}}//檢車四個方向是否合格public static boolean check(int p1,int p2,int k){p1+=f[0][k];p2+=f[1][k];if((p1<0)||(p1>maze[0].length-1)||(p2<0)||(p2>maze.length-1) ||(maze[p1][p2]!=0))return false;return true;}}