zoukankan      html  css  js  c++  java
  • 济南学习 Day 3 T2 pm

    LYK 快跑!(run)
    Time Limit:5000ms Memory Limit:64MB
    题目描述
    LYK 陷进了一个迷宫! 这个迷宫是网格图形状的。 LYK 一开始在(1,1)位置, 出口在(n,m)。
    而且这个迷宫里有很多怪兽,若第 a 行第 b 列有一个怪兽,且此时 LYK 处于第 c 行 d 列,此
    时这个怪兽对它的威胁程度为|a-c|+|b-d|。
    LYK 想找到一条路径,使得它能从(1,1)到达(n,m),且在途中对它威胁程度最小的怪兽的
    威胁程度尽可能大。
    当然若起点或者终点处有怪兽时,无论路径长什么样,威胁程度最小的怪兽始终=0。
    输入格式(run.in)
    第一行两个数 n,m。
    接下来 n 行,每行 m 个数,如果该数为 0,则表示该位置没有怪兽,否则存在怪兽。
    数据保证至少存在一个怪兽。
    输入格式(run.out)
    一个数表示答案。
    输入样例
    3 4
    0 1 1 0
    0 0 0 0
    1 1 1 0
    输出样例
    1
    数据范围
    对于 20%的数据 n=1。
    对于 40%的数据 n<=2。
    对于 60%的数据 n,m<=10。
    对于 80%的数据 n,m<=100。
    对于 90%的数据 n,m<=1000。
    对于另外 10%的数据 n,m<=1000 且怪兽数量<=100。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #define N 1010
     6 using namespace std;
     7 int a[N][N],b[N][N],n,m,num,qx[N*N],qy[N*N],vis[N][N];
     8 int ax[4]={0,0,1,-1};
     9 int ay[4]={1,-1,0,0};
    10 bool check(int limit)
    11 {
    12     memset(vis,0,sizeof(vis));
    13     memset(qx,0,sizeof(qx));
    14     memset(qy,0,sizeof(qy));
    15     int head=0,tail=1;
    16     qx[1]=1;qy[1]=1;vis[1][1]=1;
    17     while(head<tail)
    18     {
    19         ++head;int nx=qx[head],ny=qy[head];
    20         for(int i=0;i<4;i++)
    21         {
    22             int xx=nx+ax[i],yy=ny+ay[i];
    23             if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&!a[xx][yy]&&b[xx][yy]>=limit)
    24             {
    25                 ++tail;qx[tail]=xx;qy[tail]=yy;vis[xx][yy]=1;
    26                 if(xx==n&&yy==m)return true;
    27             }
    28         }
    29     }// 宽搜检查是否从起点到终点能行得通 
    30     return false;
    31 }
    32 void BFS()
    33 {
    34     int head=0,tail=num;
    35     while(head<=tail)
    36     {
    37         ++head;int nx=qx[head],ny=qy[head];
    38         for(int i=0;i<4;i++)
    39         {
    40             int xx=nx+ax[i],yy=ny+ay[i];
    41             if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!b[xx][yy]&&!a[xx][yy])
    42             {
    43                 b[xx][yy]=b[nx][ny]+1;
    44                 ++tail;qx[tail]=xx;qy[tail]=yy;
    45             }
    46         }
    47     }
    48 }
    49 int main()
    50 {
    51     scanf("%d%d",&n,&m);
    52     for(int i=1;i<=n;i++)
    53       for(int j=1;j<=m;j++)
    54       {
    55           scanf("%d",&a[i][j]);
    56           if(a[i][j])
    57           {
    58               qx[++num]=i;qy[num]=j;
    59           }
    60       }
    61     if(a[1][1]||a[n][m])// 特判 
    62     {
    63         printf("0");
    64         return 0;
    65     }
    66     BFS();
    67     int l=0,r=N*N,ans=0;
    68     while(l<=r)
    69     {
    70         int mid=(l+r)/2;//  二分怪兽的影响范围 
    71         if(check(mid))
    72         {
    73             l=mid+1;
    74             ans=mid;
    75         }
    76         else r=mid-1;
    77     }
    78     printf("%d",ans);
    79     return 0;
    80 }

    思路:见↑↑↑↑↑↑↑↑

    最小值中求最大,最大值中求最小,非常符合二分答案的特点(标志)

  • 相关阅读:
    整个过程
    iframe 重新加载闪过白块问题
    C# 获得两日期之间所有月份(包括跨年)
    新手是个框,啥都往里装!---谨以此文致歉博友和自己的无知
    C# 和Java的foreach的不同用法
    终于鼓起勇气,辞掉了第一份工作
    Java Junit4测试功能
    自学Android的第一个小程序(小布局、button点击事件、toast弹出)
    JS--Div中数据滚动到最后一条重新从头开始滚动
    RelativeLayout与LinearLayout的区别
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6038982.html
Copyright © 2011-2022 走看看