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 @ 2024-04-23 14:31  纯粹的  阅读(83)  评论(0)    收藏  举报