您的位置:首页 > 其它

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#
#####

样例输出

4

DFS代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: