洛谷P1411 01迷宫
题目描述
有一个仅由数字00与11组成的n \times nn×n格迷宫。若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入格式
第11行为两个正整数n,mn,m。
下面nn行,每行nn个字符,字符只可能是00或者11,字符之间没有空格。
接下来mm行,每行22个用空格分隔的正整数i,ji,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。
输出格式
mm行,对于每个询问输出相应答案。
一道DFS题。
在迷宫中如果能从一个点A到点B那么也可也从点B到点A。
那么只要从一个点开始搜索,然后将所有搜到的点赋上同一个值就行了。
这题数据比较大,所以要先预处理一遍然后再查询。
#include<iostream> #include<cstring> using namespace std; int n,m,ans[1005][1005],as,kans[1000005]; int map[1005][1005]; void g(int x,int y,int bl); int main() { char q; int i,j; int a,b; cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>q; if(q=='1') map[i][j]=1; else map[i][j]=0; } for(i=0;i<=n+1;i++) { map[0][i]=-1; map[i][0]=-1; map[n+1][i]=-1; map[i][n+1]=-1; } as=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(ans[i][j]==0) { as++; g(i,j,!map[i][j]); } for(i=1;i<=m;i++) { cin>>a>>b; cout<<kans[ans[a][b]]<<endl; } return 0; } void g(int x,int y,int bl) { if(ans[x][y]!=0) return ; if(map[x][y]==bl) return ; if(map[x][y]==-1) return ; ans[x][y]=as; kans[as]++; g(x+1,y,!bl); g(x,y+1,!bl); g(x-1,y,!bl); g(x,y-1,!bl); return ; }

浙公网安备 33010602011771号