题目链接
题目大意:有一个迷宫他只有0 和 1,你每次只可以从0走到1或者1走到0,不能走0 0 或者 1 1,给定地图和某点坐标求最多可以走多少个格子。只需要用DFS找到所有的联通块,联通块内所有的格子的答案都是这个联通块的格子数目。
题目中n≤1000,m≤100000
如果每个一个点的坐标就遍历一次会TLE,由于是求联通块的格子数目,所以在一个联通块内的可以走过的格子数目应该是一样的,所以我们可以开一个cnt[200010]数组来记录。我们将同一连通块内的flag数组定义为t,下一个连通块t++,最后输出 cnt[flag[x1][y1]即可
#include<iostream>
#include<queue>
using namespace std;
const int N = 1010;
int mapp[N][N],flag[N][N],cnt[200010];
int n,m,sum,t=1;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
struct node
{
int x,y;
};
void bfs(int x,int y)
{
node now,next;
queue<node> q;
sum = 1;
now.x = x,now.y = y;
flag[x][y] = t;
q.push(now);
while(!q.empty())
{
now = q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x = now.x + dx[i];
next.y = now.y + dy[i];
if(next.x>=1&&next.y>=1&&next.x<=n
&&next.y<=n&&!flag[next.x][next.y]
&&(mapp[next.x][next.y]!=mapp[now.x][now.y]))
{
sum++;
flag[next.x][next.y] = t;
q.push(next);
}
}
}
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&mapp[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(!flag[i][j])
{
bfs(i,j);
cnt[t] = sum;
t++;
}
}
for(int i=1;i<=m;i++)
{
int x1,y1;
cin>>x1>>y1;
cout<<cnt[flag[x1][y1]]<<endl;
}
}