POJ 3984 迷宮問題(搜尋)
阿新 • • 發佈:2018-12-02
迷宮問題
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 33756 | Accepted: 19213 |
Description
定義一個二維陣列:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
Input
一個5 × 5的二維陣列,表示一個迷宮。資料保證有唯一解。
Output
左上角到右下角的最短路徑,格式如樣例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
簡單搜尋,用一個結構體棧來儲存臨時路徑,一個結構體陣列來儲存最短路徑,實時更新最短路徑的結構體陣列,最後輸出
程式碼如下:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; int maze[5][5]; struct step { int tx,ty; }; step s[10000],t[10000]; int sizee = sizeof(t); int cou,minn;//cou 為棧頂,minn為走的最小步數 int next[4][2] = { {-1, 0}, {1, 0}, {0, 1}, {0, -1} };//上下左右四個方向 void dfs(int x,int y,int dep)//dep代表當前的步數 { if(dep > minn)//剪枝,當途中步數大於最小步數的時候就已經沒有必要再繼續了 return; if((x == 4) && (y == 4)) { if(dep < minn)//若抵達終點且步數小於minn,更新minn,並將棧拷貝到陣列,若無更小最後輸出s { minn = dep; memcpy(s,t,sizee); } return; } for(int i = 0;i < 4; i++) { int nx = x + next[i][0]; int ny = y + next[i][1]; if(nx >= 5 || nx < 0 || ny >= 5 || ny < 0 || maze[nx][ny])//越界與標記檢查 continue; t[cou].tx = nx; t[cou].ty = ny; cou++; maze[nx][ny] = 1; dfs(nx,ny,dep + 1); maze[nx][ny] = 0; cou--; } } int main() { int x,y; x = y = 0; for(int i = 0;i < 5; i++) for(int j = 0;j < 5; j++) scanf("%d",&maze[i][j]); cou = 0,minn = 1 << 30; t[cou].tx = x,t[cou].ty = y,cou++;//將(0,0)先入棧 maze[0][0] = 1; // 標記起點 dfs(x,y,1); for(int i = 0;i < minn; i++) printf("(%d, %d)\n",s[i].tx,s[i].ty); return 0; }