L3-037 夺宝大赛

原题链接

code

#include<bits/stdc++.h>
using namespace std;

int dis[105][105];
int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1};
int a[105][105];
int vis[105][105]={0};


struct node
{
    int x,y;
};

map<int,int> cnt;
map<int,int> ren;
int main()
{
    memset(dis,0x3f,sizeof dis);


    int n,m;
    cin>>n>>m;


    int startx,starty;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==2)
            {
                startx=i;
                starty=j;
            }
        }
    }

    //搜索,标记每个点离大本营的距离
    queue<node> q;
    q.push({startx,starty});
    dis[startx][starty]=0;
    while(q.size())
    {
        int x=q.front().x,y=q.front().y;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x1=x+xx[i],y1=y+yy[i];
            if(x1>0&&x1<=n&&y1>0&&y1<=m&&a[x1][y1]==1)
            {
                if(dis[x1][y1]>dis[x][y]+1)
                {
                    dis[x1][y1]=dis[x][y]+1;
                    q.push({x1,y1});
                }
            }
        }
    }


    int k;
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        int x,y;
        cin>>y>>x;
        if(!(x>m||y>n||y<0||x<0))
        {
            cnt[dis[x][y]]++;//距离的人数
            ren[dis[x][y]]=i;//如果人数只有一个,那存储的人就是的
        }
        //printf("(%d,%d) :%d\n",x,y,dis[x][y]);
    }

    int flag=0,ans;
    for(int i=0;i<=100000;i++)
    {
        if(cnt[i]==1)
        {
            cout<<ren[i]<<" "<<i;
            flag=1;
        }
        if(flag) break;
    }

    if(!flag) puts("No winner.");

    return 0;
}

posted @   纯粹的  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示