侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】T1251 仙岛求药

Allen Best
2023-07-10 / 0 评论 / 0 点赞 / 90 阅读 / 1,022 字
温馨提示:
本文最后更新于 2023-07-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
#include<bits/stdc++.h>
#define N 26
using namespace std;
int r,c;
char a[N][N];
bool vis[N][N];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct node
{
    int x;
    int y;
    int step;
};

void bfs(int sx,int sy,int ex,int ey)
{
    bool flag=true;
    memset(vis,0,sizeof(vis));
	queue <node> q;
    vis[sx][sy]=1;
    node st;
    st.x=sx;
    st.y=sy;
    st.step=0;
    q.push(st);
    while(!q.empty())
    {
    	node nw = q.front();
        int x=nw.x;
        int y=nw.y;
        int step=nw.step;
        if(x==ex&&y==ey)
        {
            flag=false;
            printf("%d\n",step);
            break;
        }
        for(int i=0;i<4;i++)
        {
            int nx=x+dir[i][0];
            int ny=y+dir[i][1];
            if(nx>=0&&nx<r&&ny>=0&&ny<c&&vis[nx][ny]==0&&a[nx][ny]=='.')
            {
                vis[nx][ny]=1;
                node nxt;
                nxt.x=nx;
                nxt.y=ny;
                nxt.step=step+1;
                q.push(nxt);
            }
        }
       q.pop();
    }
    if(flag)
        printf("-1\n");
}
int main()
{
    int sx,sy,ex,ey;
    while(scanf("%d%d",&r,&c)!=EOF&&(r||c))
    {
        for(int i=0;i<r;i++)
            scanf("%s",a[i]);
        for(int i=0;i<r;i++)
            for(int j=0;j<c;j++)
            {
                if(a[i][j]=='@')
                {
                    sx=i;
                    sy=j;
                }
                if(a[i][j]=='*')
                {
                    ex=i;
                    ey=j;
                    a[i][j]='.';
                }
            }
        bfs(sx,sy,ex,ey);
    }
    return 0;
}
0

评论区