@[妖孽皇](/space/show?uid=122716) 你想一下,对于一个点(i,j)和他所能到达的点 ,把这些点看成一个联通图,他们所能到达的格子的数目是不是一样的?
by 基地A_I @ 2019-03-15 18:22:11
### 联通图 改成 联通块
by 基地A_I @ 2019-03-15 18:22:56
@[基地A_I](/space/show?uid=147511) 是啊,可是我已经这样了
by 妖孽皇 @ 2019-03-15 18:23:14
???我没认真看诶,等我认真看一下你的代码^_^
by 基地A_I @ 2019-03-15 18:25:10
@[基地A_I](/space/show?uid=147511) 可以dfs搜到的点的坐标存在a和b里,搜出来了再存ans里,标上序号,过一会如果又有了就直接输出
by 妖孽皇 @ 2019-03-15 18:25:27
那~~,我贴一下我的代码,介意吗?
by 基地A_I @ 2019-03-15 18:26:59
@[基地A_I](/space/show?uid=147511) 没关系啊
by 妖孽皇 @ 2019-03-15 18:27:56
@[妖孽皇](/space/show?uid=122716) 诶,你这样 ~~好像没有什么用~~
by 基地A_I @ 2019-03-15 18:28:08
@[基地A_I](/space/show?uid=147511) e。。。事实上我并不会写
by 妖孽皇 @ 2019-03-15 18:28:50
# _我的代码(~~没打注释别介意~~)_
```cpp
#include<bits/stdc++.h>
#define Good return
#define Lucky 0
using namespace std;
struct node
{
int x,y;
}color[10000007];
int cnt;
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
int n,m,sum;
char mp[1007][1007];
int flag[1007][1007];
int ans[1000007];
void Dfs(int x,int y,int num)
{
for(int i=0;i<4;++i)
{
int nx = x+dx[i];
int ny = y+dy[i];
if(nx>=1 && nx<=n && ny>=1 && ny<=n)
if(!flag[nx][ny] && mp[nx][ny]!=mp[x][y])
{
sum++;
flag[nx][ny] = num;
Dfs(nx,ny,cnt);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>mp[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(!flag[i][j])
{
++cnt;
sum = 1;
flag[i][j] = cnt;
Dfs(i,j,cnt);//染色
ans[cnt] = sum;
}
}
for(int i=1;i<=m;++i)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",ans[flag[x][y]]);
}
Good Lucky;
}
```
by 基地A_I @ 2019-03-15 18:30:01