1629 01迷宫
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 钻石 Diamond
查看运行结果
题目描述 Description
有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。那么对于给定的迷宫,询问从某一格开始能移动到多少格。
输入描述 Input Description
输入的第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个0,询问从这一格开始能移动到多少格。
输出描述 Output Description
输出包括m行,对于每个询问输出答案。
样例输入 Sample Input
2 2
01
10
1 1
2 2
样例输出 Sample Output
4
4
数据范围及提示 Data Size & Hint
【样例说明】
所有格子互相可达。
【数据规模】
对于20%的数据,n≤10;
对于40%的数据,n≤50;
对于50%的数据,m≤5;
对于60%的数据,n≤100,m≤100;
对于100%的数据,n≤1000,m≤1000000。
分类标签 Tags 点此展开
暂无标签
#include<cstdio> #include<iostream> #include<queue> using namespace std; #define N 1001 int n,m,dx[]={1,0,0,-1},dy[]={0,1,-1,0}; struct node{ int x,y; }o,t; queue<node> q; char str[N]; int a[N][N],f[N][N],mem[N][N]; inline void bfs(){ for(int i=0;i<m;i++){ cin>>o.x>>o.y; o.x--;o.y--; if(mem[o.x][o.y]){ printf("%d\n",mem[o.x][o.y]);continue; } int cnt=0; q.push(o); while(!q.empty()){ o=q.front(); for(int j=0;j<4;j++){ t.x=dx[j]+o.x; t.y=dy[j]+o.y; if(t.x<0||t.y<0||t.x>=n||t.y>=n);else if(f[t.x][t.y]!=-1&&a[t.x][t.y]+a[o.x][o.y]==1){//关键在这里 f[t.x][t.y]=-1; q.push(t); cnt++; } } q.pop(); } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(f[i][j]==-1) f[i][j]=0, mem[i][j]=cnt; if(cnt==0) cnt++; printf("%d\n",cnt); } } int main(){ cin>>n>>m; for(int i=0;i<n;i++){ cin>>str; for(int j=0;j<n;j++) a[i][j]=str[j]-‘0‘; } bfs(); return 0; }
时间: 2024-10-11 22:21:34