题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是00或者11,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,ji,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
m行,对于每个询问输出相应答案。
分析:这道题是迷宫题,又是要最短路程,当然是bfs了。关键是如何dfs,可以用flag数组,记录每个点是否走过,如果没走过,加入数组q,之后继续bfs
代码:
#include<bits/stdc++.h> using namespace std; char mapx[1001][1001]; int flag[1001][1001],a[1000001]; struct mg { int x,y; }q[1000001]; int main() { int sx,sy,i,j,n,m,l,nx,ny,k,f,r,sum,d; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; scanf("%d %d",&n,&m); memset(a,0,sizeof(a)); memset(flag,0,sizeof(flag)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>mapx[i][j]; d=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(flag[i][j]==0) { d++; f=1; r=1; q[f].x=i; q[f].y=j; flag[i][j]=d; sum=1; while(f<=r) { for(k=0;k<4;k++) { nx=q[f].x+dx[k]; ny=q[f].y+dy[k]; if(flag[nx][ny]==0&&nx>=1&&nx<=n&&ny>=1&&ny<=n&&((mapx[nx][ny]=='1'&&mapx[q[f].x][q[f].y]=='0')||(mapx[nx][ny]=='0'&&mapx[q[f].x][q[f].y]=='1'))) { r++; sum++; flag[nx][ny]=d; q[r].x=nx; q[r].y=ny; } } f++; } a[d]=sum; } } } for(i=1;i<=m;i++) { cin>>sx>>sy; cout<<a[flag[sx][sy]]<<endl; } return 0; }