silencer468 @ 2024-03-13 19:13:41
#include<iostream>
using namespace std;
int n,m;
string a1[1000];//地图
short book[1001][1001];
short fxx[]={1,-1,0,0};
short fyy[]={0,0,1,-1};
int f[100001];每个连通图的值
long long ans;
int d;//第几个连通图
void dfs(int x,int y){
for(int i=0;i<4;i++){
int xx=fxx[i]+x,yy=fyy[i]+y;
if(xx>=0&&xx<n&&yy>=0&&yy<n)
if(a1[xx][yy]!=a1[x][y]&&book[xx][yy]==0){
f[d]++;
book[xx][yy]=d;
dfs(xx,yy);
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a1[i];
}
//用于记录是第几个连通图
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
x--;y--;
//如果是已探索过的连通图中,则直接输出答案
if(book[x][y]==0){
d++;
ans=0;
book[x][y]=d;
f[d]++;
dfs(x,y);
cout<<f[book[x][y]]<<endl;
}else cout<<f[book[x][y]]<<endl;
}
return 0;
}
by xxc123 @ 2024-03-15 20:59:47
@silencer468 ```c
using namespace std;
int fx[5]={-1,0,0,1},fy[5]={0,-1,1,0},ans[100005];
bool mp[1050][1050];
int visited[1050][1050];
int s,n,m;
void f(int x,int y,int sign,int v)
{
//cout<<x<<' '<<y<<' '<<sign<<endl;
if(x<0||x>=n||y<0||y>=n) return;
if(mp[x][y]==sign||visited[x][y]) return;
s++;
visited[x][y]=v;
for(int i=0;i<4;i++)
{
f(x+fx[i],y+fy[i],mp[x][y],v);
}
return;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
char t;
cin>>t;
// cout<<"aa "<<t<<endl;
mp[i][j]=t-'0';
}
}
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
if(visited[x-1][y-1])
{
cout<<ans[visited[x-1][y-1]]<<endl;
}else
{
s=0;
f(x-1,y-1,!mp[x-1][y-1],i+1);
ans[i+1]=s;
cout<<s<<endl;
}
}
return 0;
}
by silencer468 @ 2024-03-15 23:53:06
@xxc123 佬,你的代码思路和我差不多,那我是错在哪里呢?