P1141 60分求调

题目总版

1048645526wangyuxin @ 2024-11-26 21:18:03

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct shudui{long x,y;};
char a[1001][1001];
long b[1001][1001];//b存数值 
int n,m;
bool f[1001][1001];
queue<int> qx,qy;
shudui fu[1001][1001];
shudui find(int x,int y);
void hebing(int x1,int y1,int x2,int y2);
void bfs(int x,int y);
signed main(){
//  freopen("sb.in","r",stdin);
//  freopen("sb.out","w",stdout);
    cin>>n>>m;
    char ch;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>ch;
            a[i][j]=ch;
        }
    }
//  for(int i=1;i<=n;i++){
//      cout<<a[i]<<endl;
//  }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            fu[i][j].x=i;
            fu[i][j].y=j;
        }
    }
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        if(fu[x][y].x==x&&fu[x][y].y==y){
            bfs(x,y);
            printf("%ld\n",b[x][y]); 
        }else{
            shudui ch;
            ch=find(x,y);
            printf("%ld\n",b[ch.x][ch.y]); 
        }
    }
    return 0;
}
shudui find(int x,int y){
    shudui ch;
    if(fu[x][y].x==x&&fu[x][y].y==y){
        ch.x=x;ch.y=y;
        return ch;
    }else{
        ch=find(fu[x][y].x,fu[x][y].y);
        fu[x][y].x=ch.x;
        fu[x][y].y=ch.y;
        return ch;
    }
}
void hebing(int x1,int y1,int x2,int y2){
    shudui ch1,ch2;
    ch1=find(x1,y1);
    ch2=find(x2,y2);
    fu[ch2.x][ch2.y].x=fu[ch1.x][ch1.y].x;
    fu[ch2.x][ch2.y].y=fu[ch1.x][ch1.y].y;
    return ;
}
void bfs(int x,int y){

    int tx[5]={0,1,0,-1,0};
    int ty[5]={0,0,1,0,-1};
    qx.push(x);
    qy.push(y);
    while(qx.size()!=0){
        char ch;int xx=qx.front(),yy=qy.front();
        if(a[xx][yy]=='0'){
            ch='1';
        }else{
            if(a[xx][yy]=='1'){
                ch='0';
            }//else ch=0;
        }
        b[x][y]++;
        a[xx][yy]='2';
        f[xx][yy]=1;
//      cout<<xx<<' '<<yy<<endl;
//      cout<<ch<<endl;
//      for(int i=1;i<=n;i++){
//          for(int j=1;j<=n;j++){
//              cout<<a[i][j];
//          }cout<<endl;
//      }cout<<endl;
        for(int i=1;i<=4;i++){
            if(a[xx+tx[i]][yy+ty[i]]==ch&&xx+tx[i]>0&&xx+tx[i]<=n&&yy+ty[i]>0&&yy+ty[i]<=n&&f[xx+tx[i]][yy+ty[i]]==0){
//              cout<<xx+tx[i]<<' '<<yy+ty[i]<<endl;
                f[xx+tx[i]][yy+ty[i]]=1;
                qx.push(xx+tx[i]);
                qy.push(yy+ty[i]);
                hebing(x,y,xx+tx[i],yy+ty[i]);
            }
        }
        qx.pop();
        qy.pop();
    }
    return ;
}

|