题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105278#problem/K
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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)
题解:注意暴力搜索记录路径的题,一个学到的很好的方法就是开一个数组记录当前节点的父亲节点,然后最后输出的时候,从最后一个点依次向前面找,按照父亲找父亲的方法找下去,最后就是路径了
1 #include<cstdio> 2 #include<cstring> 3 #include<stack> 4 #include<queue> 5 #include<string> 6 using namespace std; 7 int mp[5][5]; 8 struct Node{ 9 int x; 10 int y; 11 }; 12 Node fa[5][5]; 13 bool vis[5][5]; 14 bool ck(Node k) 15 { 16 if(k.x<=4&&k.x>=0&&k.y>=0&&k.y<=4) return true; 17 return false; 18 } 19 20 int go[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 21 22 void bfs(){ 23 queue<Node>q; 24 memset(vis,0,sizeof(vis)); 25 Node tm; 26 tm.x = 0; 27 tm.y = 0; 28 q.push(tm); 29 vis[0][0] = 1; 30 while(!q.empty()){ 31 Node tm1 = q.front();q.pop(); 32 Node fl; 33 for(int i = 0; i < 4; i++){ 34 fl.x = tm1.x+go[i][0]; 35 fl.y = tm1.y+go[i][1]; 36 if(ck(fl)&&vis[fl.x][fl.y]==0&&mp[fl.x][fl.y]==0){ 37 q.push(fl); 38 vis[fl.x][fl.y] = 1; 39 fa[fl.x][fl.y] = tm1; 40 } 41 } 42 } 43 } 44 45 int main() 46 { 47 for(int i = 0; i < 5; i++) 48 for(int j = 0; j < 5; j++) 49 scanf("%d",&mp[i][j]); 50 bfs(); 51 stack<Node>v; 52 Node ff = fa[4][4]; 53 while(!(ff.x==0&&ff.y==0)){ 54 v.push(ff); 55 ff = fa[ff.x][ff.y]; 56 } 57 printf("(0, 0)\n"); 58 while(!v.empty()){ 59 printf("(%d, %d)\n",v.top().x,v.top().y); 60 v.pop(); 61 } 62 printf("(4, 4)\n"); 63 return 0; 64 }