深搜演算法例項:老鼠走迷宮(一)
阿新 • • 發佈:2019-01-06
這個是簡單的深搜,應該輸入深搜中拋磚型的,聯絡下程式碼,回顧一下深搜的思想。
本題的要求是,在開始點(1,1)和終點(5,5)放一隻老鼠,讓老鼠找到一條路徑走出去(暫時不考慮最短路徑),找到後輸出路徑。
最簡單的想法就是對於上下左右四個進行刨根型的搜尋,找到就返回輸出,進入死衚衕了就原路返回,找最近的有其他路徑的點,繼續搜尋,知道找出為止。
下面是程式碼部分。
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 1
#define FAIL 0
int visit(int,int);
void map ();
void route();
int maze[7][7]={
{2,2,2,2,2,2,2},
{2,0,0,0,0,0,2},
{2,0,0,0,2,0,2},
{2,0,0,0,0,2,2},
{2,2,0,2,0,2,2},
{2,0,0,0,0,0,2},
{2,2,2,2,2,2,2}};
int start_i=1,start_j=1;
int end_i=5,end_j=5;
int flag=FAIL;
int main(void)
{
map();
route();
return 0;
}
void map()
{
int i,j;
printf("顯示迷宮:\n");
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
if(maze[i][j]==2)
printf("*");
else
printf(" ");
printf("\n");
}
}
void route()
{
int i,j;
if(visit(start_i,start_j)==FAIL)
printf ("\n此路不同!換個地圖!");
else{
printf("\n顯示路徑:\n");
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
if(maze[i][j]==2)
printf("*");
else if(maze[i][j]==1)
printf("@");
else
printf(" ");
printf("\n");
}
}
}
int visit(int i,int j)
{
maze[i][j]=1;
if(i==end_i && j==end_j)
flag=SUCCESS;
if(flag==FAIL && maze[i][j+1]==0)
visit(i,j+1);
if(flag==FAIL && maze[i+1][j]==0)
visit(i+1,j);
if(flag==FAIL && maze[i-1][j]==0)
visit(i-1,j);
if(flag==FAIL && maze[i][j-1]==0)
visit(i,j-1);
if(flag==FAIL)
maze[i][j]=0;
return flag;
}
從上面的分析中我們只看visit()函式
我們用了0,1,2三個數表示地圖某一點的狀態:
1.0表示無障礙
2.1表示通路中的一點
3.2表示障礙
並用一個數組儲存
我們看到,在visit()函式中進行了函式自身呼叫(可以看做是遞迴),這裡是先朝著右邊搜尋,然後是上,下,左,如果還能往下走就接著往下走,走到不能再走為止。如果是死衚衕,則就退到上一節點(這就是回溯了,在程式碼中的maze[i][j]=0表現),在新的節點繼續試探,看有沒有能一直走到終點的路線,一旦找到就馬上返回(在flag=SUCCESS這裡說明,找到一條就不再找別的路線了),沒有的話就接著深搜,直到遍歷完所有的節點發現到底有沒有通路存在。
總的來說這個作為深搜的入門挺不錯,沒有難度,還有點小趣,同時還能再回顧下遞迴的思想