C语言网(蓝桥杯题库) 1672:迷宫问题(BFS)

 

题目描述

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

9

有没有哪位大lao告诉我一下  为什么mp必须每次循环都要初始化为0 

#include
using namespace std;
#define M 110
char mp[M][M];
bool vis[M][M];
int n,m,sx,sy,ans,N;
int dir[4][2]  = { 1,0,0,-1,-1,0,0,1};

struct node
{
	int x;
	int y;
	int step;
	node (int xx,int yy,int ste) //用构造函数 主要是为了记录step(求最短路径) 
	{							//要与之前的 hdu 1312 区别 
		x=xx;
		y=yy;
		step =ste;
	}
}; 

bool check(int x ,int y)
{
	if(x<0 || x>=n  || y<0 || y>=m || vis[x][y] || mp[x][y] == '#')
	return false;
	return true;
} 

queue   q;
int bfs(int x, int y)
{
	q.push(node(x,y,0));
	while(!q.empty())
	{
		node a=q.front();
		while(mp[a.x][a.y] == 'E')
		return a.step;
		q.pop();
	
		for(int i=0;i<4;++i)
		{
			int bx = a.x+ dir[i][0];
			int by = a.y + dir[i][1];
			if(check(bx,by))
			{	
				vis[bx][by] =1;
				q.push(node(bx,by,a.step+1));
			}
		}
	}
	return -1;
}

int main()
{
	
	scanf("%d",&N);
	while(N--)
  {	//这里一定要清空 vis 和 mp    
    // 其实我也不太明白 为什么这里 mp一定要清空  要么就是错的
	memset(vis,0,sizeof(vis));
	memset(mp,0,sizeof(mp));
	scanf("%d%d",&n,&m);// n行数  m列数 
	
	for(int i=0;i>mp[i][j];
			if (mp[i][j]  == 'S')
			{
				sx=i;
				sy=j;
			}
		}
	 } 
	 vis[sx][sy]=1;
	 
	 printf("%d",bfs(sx,sy));
	 if(N != 0)  printf("\n");	
  }
	 
	return 0;
 } 

 

第二种方法: 

#include
#include
#include 
#include 
using namespace std;
 
int n,m,ans; //Ò»¶¨²»Òª ¶¨Òåcou=1  È«¾Ö±äÁ¿ 
char mp[25][25];
int vis[25][25];
int s_x,s_y;
int dir[4][2]={0,-1,-1,0,0,1,1,0};
 
 
struct node
{
    int x;
    int y;
    int lev;//务必加上lev 不然就全部搜索一遍,样例输出 所有'-'的数量
};
 
bool check(int x,int y){
    if(x<0 || x >= m || y < 0 || y >= n || vis[x][y] || mp[x][y] == '#')
    return false;
    
    return true;
    
}
 
queue  q;
void bfs(int x, int y) {
    node now,n;
    now.x=x;
    now.y=y;
    now.lev=0;
    q.push(now);
     
    while (!q.empty()) {
         now = q.front();
        q.pop();
    
        for (int i = 0; i < 4; i++) {
             n.x = now.x + dir[i][0];
             n.y = now.y + dir[i][1];
            if (check(n.x, n.y)) {
                n.lev=now.lev+1;
                if(mp[n.x][n.y]=='E')
   				 {
    				ans=n.lev;
    				return;
				}
                q.push(n);
                vis[n.x][n.y] = 1;
            }
        }
    }
} 

int main (){
    while(scanf("%d%d",&n,&m)!=EOF)//n´ú±íÁÐÊý  m´ú±íÐÐÊý 
    {
        if(n ==0 && m==0)  break; 
        memset(vis,0,sizeof(vis));
        ans=0;
        for(int i=0;i>mp[i][j];
                if(mp[i][j] == 'S')
                {
                    s_x=i;
                    s_y=j;
                }
            }    
        }
        vis[s_x][s_y]=1;
        bfs(s_x,s_y);
        printf("%d\n",ans);
    }
    return 0;
}

 

你可能感兴趣的:(蓝桥杯)