zoukankan      html  css  js  c++  java
  • 迷 宫

    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”(不包含引号)

    Example

    maze.in maze.out

    3 3

    1 2 3

    2 3 4

    3 4 5

    2 2

    2

    1 2

    2 3

    5

    Yes

    No

    Hint

    对于 10%的数据,(sx,sy)为迷宫内的最高点。

    对于 30%的数据,1<=N,M<=5,q=1。

    对于 60%的数据,1<=N,M<=100,q<=100。

    对于 100%的数据,1<=N,M<=2000,q<=1000。

    思路:很简单的棋盘型dfs问题,只要控制好边界,方向,高度,一步一步的搜索就可以、

             最后的询问需要单独开一个vis数组

             范围!范围!范围!

    没看范围全部爆内存的代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<cstdlib>
     7 using namespace std;
     8 int xx[5]={-1,+1,0,0};
     9 int yy[5]={0,0,-1,+1};
    10 int a[10001][10001];
    11 int vis[10001][10001];
    12 int tot;
    13 int n,m;
    14 void dfs(int x,int y)
    15 {
    16     vis[x][y]=1;
    17     for(int i=0;i<4;i++)
    18     {
    19         int h=a[x][y];
    20         if(a[x+xx[i]][y+yy[i]]<=h&&vis[x+xx[i]][y+yy[i]]==0&&x+xx[i]>=1&&x+xx[i]<=n&&y+yy[i]>=1&&y+yy[i]<=m)
    21         {
    22             tot--;
    23             vis[x+xx[i]][y+yy[i]]=1;
    24             dfs(x+xx[i],y+yy[i]);
    25         }
    26     }
    27 }
    28 int main()
    29 {
    30     freopen("maze.in","r",stdin);
    31     freopen("maze.out","w",stdout);
    32     scanf("%d%d",&n,&m);
    33     tot=n*m;
    34     for(int i=1;i<=n;i++)
    35     {
    36         for(int j=1;j<=m;j++)
    37         {
    38             scanf("%d",&a[i][j]);
    39         }
    40     }
    41     int sx,sy;
    42     scanf("%d%d",&sx,&sy);
    43     dfs(sx,sy);
    44     int q;
    45     scanf("%d",&q);
    46     printf("%d
    ",tot-1);
    47     for(int i=1;i<=q;i++)
    48     {
    49         int qx,qy;
    50         scanf("%d%d",&qx,&qy);
    51         if(vis[qx][qy]==1)
    52         {
    53             printf("Yes
    ");
    54         }
    55         else
    56         {
    57             printf("No
    ");
    58         }
    59     }
    60     fclose(stdin);
    61     fclose(stdout);
    62     return 0;
    63 }
  • 相关阅读:
    hadoop 3.0.0 alpha3 安装、配置
    集群使用初步
    转 mysql 中sql 语句查询今天、昨天、7天、近30天、本月、上一月 数据
    java 内存溢出
    获取手机上安装的应用信息
    使apk具有system权限
    Android基础之sqlite 数据库简单操作
    转 Android:文件下载和写入SD卡学习小结
    Android判断Service是否运行
    Android 定时重复启动弹出窗口。
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6680091.html
Copyright © 2011-2022 走看看