90分样例二没过求助
  • 板块P1141 01迷宫
  • 楼主Hikario
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/10/22 12:28
  • 上次更新2023/10/27 06:32:52
查看原帖
90分样例二没过求助
608187
Hikario楼主2022/10/22 12:28

先求每个连通块的大小,查询每个点时就直接输出这个点所在连通块的大小。别的9个点都过了但是2卡了(悲)QAQ求各位大佬帮忙看看罢。

#include<iostream>
using namespace std;
const int N=1050,M=100100;
int n,q;
bool a[N][N],vis[N][N];
int id[N][N],cnt[M],idx=0,sum;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void dfs(int x,int y)
{
    int tx,ty;
    for(int i=0;i<4;i++)
    {
        tx=x+dx[i],ty=y+dy[i];
        if(vis[tx][ty]||!(a[x][y]^a[tx][ty])||tx<1||tx>n||ty<1||ty>n)continue;
        sum++,vis[tx][ty]=true,id[tx][ty]=idx,dfs(tx,ty);
    }
    cnt[idx]=sum;
}
int main()
{
    char c;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>c,a[i][j]=c-'0';
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        if(!vis[i][j])id[i][j]=idx,vis[i][j]=true,sum=1,dfs(i,j),idx++;
    int t,tt;
    while(q--)scanf("%d%d",&t,&tt),printf("%d\n",cnt[id[t][tt]]);
    return 0;
}
2022/10/22 12:28
加载中...