题目:
思路:由于它只能从+走到-或从-走到+号,可以把迷宫看成由多个连通块或者集合组成的,不需要对每个点都进行dfs,我们只要对于所有连通块的一个点进行dfs即可,因此可以维护一个并查集,但本人太懒。。就直接用了标记,属于某一个连通块的所有点都标记成一样的数字,然后再开一个数组保存该数字对应的个数即可(代码如下)。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[3005][3005];
int vis[3005][3005];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int tot=0,sign=1;
int n,m;
bool check(int x,int y,char old_ch,char ch){
if(x<1||y<1||x>n||y>m||old_ch==ch) return false;
return true;
}
void dfs(int x,int y){
vis[x][y]=sign;tot++;
for(int i=0;i<4;i++){
int xx=x+dir[i][0],yy=y+dir[i][1];
if(!vis[xx][yy]&&check(xx,yy,a[x][y],a[xx][yy])) dfs(xx,yy);
}
}
int main()
{
int q,x,y;
cin>>n>>m>>q;
map<int,int> mp;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>a[i][j];
}
while(q--){
scanf("%d%d",&x,&y);
if(!vis[x][y]){
tot=0;dfs(x,y);mp[sign]=tot;sign++;
cout<<tot<<endl;
}
else cout<<mp[vis[x][y]]<<endl;
}
return 0;
}