迷宫问题算法分析
首先給出經典的算法,然后分析算法的實現
#define?? ?MAX_SIZE? 8
int H[4] = { 0, 1, 0, -1 };
int V[4] = { -1, 0, 1, 0 };
char Maze[MAX_SIZE][MAX_SIZE] =
?????????????????????????????? {{'X','X','X','X','X','X','X','X'},
???????????????????????????????? {'o','o','o','o','o','X','X','X'},
???????????????????????????????? {'X','o','X','X','o','o','o','X'},
???????????????????????????????? {'X','o','X','X','o','X','X','o'},
???????????????????????????????? {'X','o','X','X','X','X','X','X'},
???????????????????????????????? {'X','o','X','X','o','o','o','X'},
???????????????????????????????? {'X','o','o','o','o','X','o','o'},
???????????????????????????????? {'X','X','X','X','X','X','X','X'}};
void FindPath(int X, int Y)
{
if(X == MAX_SIZE || Y == MAX_SIZE)
{
???? ??? ?for(int i = 0; i < MAX_SIZE; i++)
for(int j = 0; j < MAX_SIZE; j++)
????????????????? printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '\n');
}
else
for(int k = 0; k < 4; k++)
if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
&& 'o' == Maze[X][Y])
{
???????????????? ??? ?Maze[X][Y] = ' ';
???????????????? ??? ?FindPath(X+V[k], Y+H[k]);
???????????????? ??? ?Maze[X][Y] = 'o';
}
}
int main(int argc, char* argv[])
{
??? FindPath(1,0);
}
首先解釋一下迷宮問題,就是從一個迷宮中找出從指定的起點到終點的所有的可能的路徑的問題
在上面的例子('o'表示路徑可行,‘X’表示路徑不通)中其實是從一個6X8的迷宮中找出所有的可能的路徑,增加了兩行‘X’方便程序的處理,這樣問題就成了從一個8X8的迷宮中找路徑的問題了 ,起點是(1,0)終點是(6,7)。
FindPath(1,0); //當然是從起點開始找路徑的意思了
進入到遞歸函數中去了之后顯然是執行的else里面的語句
else
for(int k = 0; k < 4; k++)//這個for loop啥意思呢, 很容易想到是要遍歷當前位置的上下左右的位置的意思
if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
&& 'o' == Maze[X][Y])
{
???????????????? ??? ?Maze[X][Y] = ' ';//這里為什么要將符合條件的位置置空,有兩個用途1,放置遍歷過的位置重復遍歷,退出一層遞歸(在這里是不滿足else的條件時)的時候方便輸出結果(可先運行代碼查看結果)
???????????????? ??? ?FindPath(X+V[k], Y+H[k]);//從V[k],H[k]可以看出V 和H這兩個數組是來表示位置的 (X+(-1),Y+0)就是表示方的的位置, 從這里可以看出遍歷當前位置的臨近位置的順序是up、right、bottom、left
???????????????? ??? ?Maze[X][Y] = 'o'; //遞歸退出之后要將當前我位置恢復, 否則的話, 該遞歸最多只能找到一種路徑
}
再看退出一層遞歸時執行的代碼
if(X == MAX_SIZE || Y == MAX_SIZE)
{
???? ??? ?for(int i = 0; i < MAX_SIZE; i++)
for(int j = 0; j < MAX_SIZE; j++)
????????????????? printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : '\n');
}
//很明顯是將這個8X8的數組按照一定的格式輸出,注意輸出之后整個遞歸過程并沒有退出這是(X,Y)往往又會滿足else里面的條件哦,這樣的話,就能將所有的路徑遍歷出來,怎么樣?這個算法還是蠻經典嘛,當然我在這里只是將這個經典算法分析一下, 有更好的方案, 還請大家不吝賜教。
?
總結
- 上一篇: Storm-源码分析-EventMana
- 下一篇: java邮件小实例