洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)相关的知识,希望对你有一定的参考价值。
https://www.luogu.org/problem/show?pid=1141
题意:n*n地图,0可以走到相邻的某个1上,1可以走到相邻的某个0上,m次询问,问(x,y)能走到多少个格子?
n<=1e3,m<=1e5.若点a能到b,则b也能到a.显然a,b能到达的点相同,同一个联通块内的ans是相同的,即求点所在的连通块大小
#include <bits/stdc++.h> using namespace std; const int N=2e3+20; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; int vis[N][N]; int n,mx,ans[N*N],cnt;//ans[i]第i块答案,连通块编号 string s[N]; int dfs(int x,int y,int cur) { vis[x][y]=cnt; mx++; int p=1-cur; for(int i=0;i<4;i++) { int a=x+dx[i]; int b=y+dy[i]; if(a>=0&&a<n&&b>=0&&b<n&&s[a][b]-‘0‘==p&&!vis[a][b]) dfs(a,b,s[a][b]-‘0‘); } } int main() { int m; while(cin>>n>>m) { cnt=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) cin>>s[i]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(!vis[i][j]) { mx=0; cnt++; dfs(i,j,s[i][j]-‘0‘); ans[cnt]=mx; } } } while(m--) { int x,y; cin>>x>>y; x--,y--; cout<<ans[vis[x][y]]<<endl; } } return 0; }
以上是关于洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)的主要内容,如果未能解决你的问题,请参考以下文章