BFS 、DFS 解决迷宫入门问题
2014-03-02 22:46
573 查看
问题 B: 逃离迷宫二
时间限制: 1 Sec 内存限制: 128 MB提交: 12 解决: 5
[提交][状态][讨论版]
题目描述
王子深爱着公主。但是一天,公主被妖怪抓走了,并且被关到了迷宫。经过了常人难以想像的努力,王子到了这个迷宫,但是迷宫太过复杂,王子想知道到底有没有路能通到公主的所在地,同时还要输出王子到公主的最短距离,机智的你一定能帮助他解决这个问题。输入
有多个测试数据。每个测试数据的第一行是2个整数n,m (0<n<50, 0<m<50)代表着迷宫的高度和宽度。
接着是个n*m的迷宫抽象图。其中,'#'代表着墙壁,'.'代表着空地,'W'代表着王子的所在地。‘G’代表这公主的所在地,
王子只可以在空地上走,并且只能上,下,左,右的走。
输出
如果王子能到达公主的所在地,输出最短的距离否则输出"Mission Failed"
样例输入
5 5#####
#G..#
###.#
#..W#
#####
样例输出
4DFS代码:
#include<stdio.h> #include<malloc.h> #include<string.h> char Graph [80][80]; int n,m,startx,starty; int Dir [4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; int Vis [80][80]; int Fit(int x , int y){ return ( x>=1 && x<= n && y>=1 && y<= m ); } int DFS (int x,int y){ int i; Vis [x][y] = 1; for(i = 0 ; i < 4 ; i++ ){ int tmpx = x + Dir [i][0]; int tmpy = y + Dir [i][1]; if(Fit (tmpx , tmpy) && Graph [tmpx][tmpy] == 'G'){ return 1; } if(Fit (tmpx , tmpy) && Vis [tmpx][tmpy] == 0 && Graph [tmpx][tmpy] == '.'){ if (DFS (tmpx ,tmpy)){ return 1; } } } return 0; } int main(){ int i ,j ; while(scanf("%d%d",&n,&m)!=EOF){ getchar(); for( i=1 ; i <= n ; i++ ){ for( j=1 ; j<=m ; j++ ){ Vis [i][j] = 0; scanf("%c", &Graph [i][j]); if(Graph [i][j] == 'W'){ startx = i; starty = j; } } getchar(); } if(DFS(startx , starty)){ printf("Good life\n"); } else{ printf("Mission Failed\n"); } } return 0; }
BFS代码:
#include<stdio.h> #include<malloc.h> #include<string.h> char Graph [80][80];//以二维数组记录图 int n,m,startx,starty; int Dir [4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//方向数组 int Vis [80][80];//记录是否已经访问过 int Dis [80][80];//记录遍历的层数 int Fit(int x , int y){//判断是否超出边界 return ( x>=1 && x<= n && y>=1 && y<= m ); } int BFS (int x , int y){ int queue[9999]; int i , head = 0 , tail = 0;//head指向队列头,tail指向队列尾 queue [tail++] = x ; queue [tail++] = y ; Vis [x][y] = 1 ; while(head < tail){//当队列为空停止搜索 int nowx = queue [head++];//取出队首x元素 int nowy = queue [head++];//取出队首y元素 for(i = 0 ; i < 4 ; i++){ int tmpx = nowx + Dir [i][0]; int tmpy = nowy + Dir [i][1]; if(Fit (tmpx,tmpy) && Graph [tmpx][tmpy] == 'G'){ return Dis [nowx][nowy] + 1;//返回值为当前层数 } if(Fit(tmpx ,tmpy) && Vis [tmpx][tmpy] == 0 && Graph [tmpx][tmpy] == '.' ){ //如果下层没有超出界限,并且没有访问过,并且为合法路径,则继续走下去 Dis [tmpx][tmpy] = Dis [nowx][nowy] + 1; Vis [tmpx][tmpy] = 1; queue [tail++] = tmpx; queue [tail++] = tmpy; } } } return 0;//如果出不了迷宫,则返回为0 } int main(){ int i ,j ; while(scanf("%d%d",&n,&m)!=EOF){ getchar(); for( i=1 ; i <= n ; i++ ){ for( j=1 ; j <= m ; j++ ){ Vis [i][j] = 0; scanf("%c", &Graph [i][j]); if(Graph [i][j] == 'W'){ startx = i; starty = j; } } getchar(); } int ans = 0; ans = BFS(startx , starty); if(ans) printf("%d\n",ans); else printf("Mission Failed\n"); } return 0; }
相关文章推荐
- BFS和DFS方法解决走迷宫问题
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- poj 迷宫问题(路径记录)(DFS,BFS)
- nyoj——58 最小步数(DFS,BFS 迷宫问题)
- 迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解
- POJ3984 迷宫问题(深搜DFS+广搜BFS)搜索记录坐标,坑
- 迷宫问题、最短路(BFS,DFS)
- poj 迷宫问题(路径记录)(DFS,BFS)
- 迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解
- POJ 3984 迷宫问题 BFS DFS两种解法
- H - 迷宫问题 POJ3984 (BFS+DFS)
- 搜索入门之dfs--经典的迷宫问题解析
- FOJ 1205 小鼠迷宫问题【BFS+dfs回溯查找路径】
- poj 迷宫问题(路径记录)(DFS,BFS)
- SDUT1157:小鼠迷宫问题(bfs+dfs)
- poj3984迷宫问题 入门搜索bfs
- POJ - 3984 迷宫问题(BFS、DFS)
- 模拟求解迷宫问题(DFS+BFS)
- 迷宫中的一类与转弯有关的问题 BFS||DFS hdoj1728,cf 793b ,hihocoder1519
- poj 迷宫问题(路径记录)(DFS,BFS)