ybt1251:仙岛求药 题解

传送门

 

 

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,m,x,y,qx,qy;//终点坐标(qx,qy) 
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},p[10001][4]; //定义队列:行、列、个数
bool b[101][101];
void bfs()
{
     int t=0,w=1; //队列头t,队列尾w
     while(t<w)
     {
     t++;
     for(int i=0;i<4;i++)
     {
         x=p[t][1]+dx[i];
         y=p[t][2]+dy[i];
         if(x>0&&x<=m&&y>0&&y<=n&&b[x][y])
         {
         w++;
         p[w][1]=x;
         p[w][2]=y;
         p[w][3]=p[t][3]+1;
         b[x][y]=false;
         if(x==qx&&y==qy)  //目标 
         {
             printf("%d\n",p[w][3]);
             return; //输出答案,结束当此扩展
         }
        }
     }
     }
     printf("-1\n");
}
int main()
{   char k;  // 字符方式输入地图 
        while(cin>>m>>n)
        {
            if(m==0&&n==0)   return 0; //输入0 0结束
            memset(p,0,sizeof(p));//调用多组数据时候 清0备用
            memset(b,true,sizeof(b));
            for(int i=1;i<=m;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    cin>>k;
                    if(k=='#')   b[i][j]=false; //障碍 
                    else b[i][j]=true;   
                    if(k=='@')     //遇到起点,就入队,并设为假
                    {
                        p[1][1]=i;   
                        p[1][2]=j;
                        p[1][3]=0; 
                        b[i][j]=false;
                    }
                    if(k=='*')  // 如果是终点,则记录下来
                    {
                        qx=i;
                        qy=j;
                    }
                    
                }
            }
            bfs();
        }
}

 

posted on 2022-04-30 20:14  lcdxjsj  阅读(200)  评论(0)    收藏  举报

导航