题目描述
有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格0上,那么你可以移动到相邻 4
格中的某一格 1 上,同样若你位于一格1上,那么你可以移动到相邻 4 格中的某一格 0 上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
第 1 行为两个正整数 n,m。
下面 n 行,每行 n 个字符,字符只可能是 0 或者 1 ,字符之间没有空格。
接下来 m 行,每行 2 个用空格分隔的正整数 i,j ,对应了迷宫中第 i 行第 j 列的一个格子,
询问从这一格开始能移动到多少格。
输出格式:
m 行,对于每个询问输出相应答案。
输入输出样例
说明
所有格子互相可达。
对于 20% 的数据, n≤10 ;
对于 40% 的数据, n≤50 ;
对于 50% 的数据, m≤5;
对于 60% 的数据, n≤100,m≤100;
对于 100% 的数据, n≤1000,m≤100000。
题解:
#include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[5000][5000]; bool vis[5000][5000],g[5000][5000]; int n,m,x,y,ans,cnt=1,d[1000005],f[5000][5000]; int xx[4]= {0,0,1,-1},yy[4]= {1,-1,0,0}; void dfs(int x,int y) { if(x<1||y<1||x>n||y>n||f[x][y]) return ; f[x][y]=cnt; ans++; for(int i=0; i<4; i++) { int fx=x+xx[i],fy=y+yy[i]; if(a[fx][fy]!=a[x][y]) dfs(fx,fy); } d[cnt]=ans; } int main() { cin>>n>>m; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cin>>a[i][j]; while(m--) { cin>>x>>y; if(!f[x][y]) { ans=0;dfs(x,y);cnt++; } ans=d[f[x][y]]; cout<<ans<<endl; } return 0; }
握不住的沙,不如扬了它。