迷宫

迷宫

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 }

 

posted @ 2017-04-19 10:40  橘生淮南终洛枳  阅读(207)  评论(0编辑  收藏  举报