迷宫
迷宫
Description
Karles 和朋友到迷宫玩耍,没想到遇上了 10000000 年一次的大洪水,好在 Karles 是一个喜
欢思考的人,他发现迷宫的地形和洪水有如下性质:
①迷宫可以被看做是一个 N*M 的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),
每个格子(i,j)都有一个高度 h(i,j)。
②洪水从(sx,sy)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子
也会被淹没。
现在 Karles 想请你帮忙算算,有多少个格子不会被淹没,以及 Karles 想问一下格子(x,y)是否
被淹没,如果被淹没的话就输出”Yes”,否则输出”No”。
Input
第一行包含两个整数 n,m。
以下 n 行,每行 m 个数,第 i 行第 j 个数表示格子高度 h(i,j)。
下面一行包含两个整数 sx,sy,表示最初被洪水淹没的格子。
下面一行包含一个整数 q,表示询问的数量。
最后 q 行每行包含两个整数 x,y,表示询问的格子。
Output
输出的第一行,为永远不会被淹没的格子的数量。
以下 q 行,为格子被淹没的情况,输出”Yes”或者”No”(不包含引号)
思路分析:
迷宫问题运用了广度优先搜索,使用了标准库queue,运用队列,定义bool函数来判断它是否已经被淹没,让第一个坐标入队,把它标记为被淹没,让其出队,然后让所有需要判断的坐标一次入队、判断(如果高度比其周围低,设为true,表示被淹没)、出队,直到队伍为空结束。如果需要判断的坐标被标记了true,就输出Yes,否则,输出No。
反思:没有熟练地运用搜索。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 using namespace std; 5 const int maxx=2001; 6 int mmap[maxx][maxx]; 7 int dx[4]={0,1,-1,0}, 8 dy[4]={1,0,0,-1}; 9 bool vis[maxx][maxx]; 10 int qque[maxx][maxx]; 11 int n,m; 12 void bfs(int x,int y) 13 { vis[x][y]=1; 14 int head=0,t=1; 15 qque[1][1]=x; 16 qque[1][2]=y; 17 do 18 { 19 head++; 20 for(int i=0;i<=3;i++) 21 { 22 int xx=qque[head][1]+dx[i]; 23 int yy=qque[head][2]+dy[i]; 24 if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&mmap[xx][yy]<=mmap[qque[head][1]][qque[head][2]]&&!vis[xx][yy]) 25 { 26 vis[xx][yy]=1; 27 t++; 28 qque[t][1]=xx; 29 qque[t][2]=yy; 30 } 31 } 32 }while(head<=t); 33 } 34 int main() 35 { 36 //freopen("maze.in","r",stdin); 37 //freopen("maze.out","w",stdout); 38 scanf("%d%d",&n,&m); 39 for(int i=1;i<=n;i++) 40 for(int j=1;j<=m;j++) 41 scanf("%d",&mmap[i][j]); 42 int x,y; 43 scanf("%d%d",&x,&y); 44 bfs(x,y); 45 int sum=0; 46 for(int i=1;i<=n;i++) 47 for(int j=1;j<=m;j++) 48 { 49 if(!vis[i][j]) 50 sum++; 51 } 52 printf("%d\n",sum); 53 int t; 54 scanf("%d",&t); 55 int i,j; 56 while(t--) 57 { 58 scanf("%d%d",&i,&j); 59 if(vis[i][j]) 60 printf("No\n"); 61 else 62 printf("Yes\n"); 63 } 64 // fclose(stdin); 65 // fclose(stdout); 66 return 0; 67 }