• 迷宫


    迷宫

    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
    ",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
    ");
    61          else
    62          printf("Yes
    ");
    63      }
    64     //    fclose(stdin);
    65     //    fclose(stdout);
    66      return 0;
    67 }
  • 相关阅读:
    TCP中的三次握手与四次挥手
    C++中的访问控制与封装
    C++中的类定义
    Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则
    Verilog学习笔记简单功能实现(三)...............同步有限状态机
    Verilog学习笔记设计和验证篇(二)...............同步有限状态机
    Verilog学习笔记设计和验证篇(一)...............总线和流水线
    Verilog学习笔记简单功能实现(二)...............全加器
    Verilog HDL模型的不同抽象级别
    Verilog学习笔记简单功能实现(一)...............D触发器
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6732127.html
Copyright © 2020-2023  润新知