40分求调

P1141 01迷宫

weizhenkai @ 2024-11-13 22:05:30

#include<bits/stdc++.h>
using namespace std;
struct node{
    int p,q;
};
queue< node > que;
vector< int > v[1000][1000];
int n,m,a[1000][1000],xx,yy,cnt,vis[1000][1000],b[1000][1000];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void bfs(int x,int y)
{
    v[x][y].push_back(x*1001+y);
    node s;
    s.p=x;s.q=y;
    que.push(s);
    while(!que.empty())
    {
        cnt++;
        node nn;
        nn=que.front();que.pop();
        for(int i=0;i<=3;i++)
        {
            node nxt=nn;
            nxt.p+=d[i][0];
            nxt.q+=d[i][1];
            if(vis[nxt.p][nxt.q]==1||nxt.p<1||nxt.p>n||nxt.q<1||nxt.q>n)continue;
            if(a[nxt.p][nxt.q]==a[nn.p][nn.q])continue;
            que.push(nxt);
            v[x][y].push_back(nxt.p*1001+nxt.q);
            vis[nxt.p][nxt.q]=1;
        }
    }
}
void he(int x,int y)
{
    b[x][y]=v[x][y].size()-1;
    for(int i=1;i<=v[x][y].size()-1;i++)
    {
        b[v[x][y][i]/1001][v[x][y][i]%1001]=v[x][y].size()-1;
    }
} 
int main()
{
    memset(a,0,sizeof(a));
    memset(vis,0,sizeof(vis));
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%1d",&a[i][j]);
        }
    }
    while(m--)
    {
        cin>>xx>>yy;
        if(b[xx][yy]==0){bfs(xx,yy);he(xx,yy);}
        cout<<b[xx][yy]<<endl;
    }
    return 0;
}

|