zoukankan      html  css  js  c++  java
  • hdu---5652---India and China Origins

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652

    Mean:

    很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁。随着喜马拉雅山海拔逐渐增加,两个地区的交流也越来越少,最终没有了来往。
    假设当时的地形和我画的一样,蓝色部分代表海洋,而且当时人们还没有发明轮船。黄色部分代表沙漠,而且沙漠上经常有野鬼散步,所以人们不敢到沙漠中行走。

    黑色的格子表示山峰,这些山峰都无比高大,所以人无法穿过。白色格子代表平原, 人可以在平原上自由行走。人每次可以向相邻的四个格子走动。 此外,我们的考古学家发现还有一些山峰会逐渐形成,通过研究发现,位置在 (x, y)(保证该位置之前没有山峰)的地方在 i 年后出现了山峰。

    现在给你若干个位置出现山峰的时间, 你可以计算出中国和印度之间的联系最早被彻底切断的时间吗?
    输入描述
    多组测试数据, 第一行为组数T(T10)。每组测试数据第一行包含两个数 N, M (1N,M500), 表示地图的大小。接下来 N 行长度为 M 0101 字符串。0代表白色格子,1代表山峰。接下来有 Q(1QN×M) 行, 第 i(1iQ) 两个整数 (x,y),0x<N,0y<M 表示在第 i(x,y) 出现了一座山峰。
    输出描述
    对于每组测试数据,输出一个数, 表示两国最早失联的时间。如果最终两国之间还有联系则输出 -1

    Sample Input

    1
    4 6
    011010
    000010
    100001
    001000
    7
    0 3
    1 5
    1 3
    0 0
    1 2
    2 4
    2 1

    Sample Output

    4
     
    analyse:
    二分+bfs;
    可以二分所有的时间,找到第一个让上下不连通的那个时间点即可;
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include<vector>
    #include<queue>
    #include<algorithm>
    
    using namespace std;
    typedef long long LL;
    
    const int maxn=509;
    const int INF=0x3f3f3f3f;
    const int mod=2009;
    
    char str[maxn][maxn];///原地图
    char maps[maxn][maxn];///即将修改的地图
    int vis[maxn][maxn];
    int n, m;
    int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
    
    struct node
    {
        int x, y;
    } s[maxn*maxn];///要注意了
    
    int BFS(int x, int y)
    {
        node p, now, next;
        p.x = x;
        p.y = y;
        queue<node>Q;
        Q.push(p);
        memset(vis, 0, sizeof(vis));
        vis[0][y] = 1;
    
        while(Q.size())
        {
            now = Q.front();
            Q.pop();
    
            if(now.x == n-1) return 1;
    
            for(int i=0; i<4; i++)
            {
                next.x=now.x+dir[i][0];
                next.y=now.y+dir[i][1];
    
                if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && maps[next.x][next.y]=='0' && !vis[next.x][next.y])
                {
                    vis[next.x][next.y] = 1;
                    Q.push(next);
                }
            }
        }
        return 0;
    }
    
    int Judge(int x)
    {
        for(int i=0; i<n; i++)
            strcpy(maps[i], str[i]);///重新构造地图,
    
        for(int i=1; i<=x; i++)///将1~mid点的变为'1'大山;
            maps[s[i].x][s[i].y]='1';
    
        for(int i=0; i<m; i++)
        {
            if(maps[0][i]=='0')///枚举所有第一行可以走的点
            {
                if(BFS(0, i))///可以连通返回1
                    return 1;
            }
        }
        return 0;
    }
    
    int main()
    {
        int T, k;
        scanf("%d", &T);
        while(T --)
        {
            scanf("%d %d", &n, &m);
            for(int i=0; i<n; i++)
                scanf("%s", str[i]);
    
            scanf("%d", &k);
            for(int i=1; i<=k; i++)
                scanf("%d %d", &s[i].x, &s[i].y);
    
            int l = 1, r = k;
            int mid, ans = -1;
    
            while(l <= r)
            {
                mid=(l+r)/2;
                if(!Judge(mid))///不连通;
                {
                    ans = mid;
                    r= mid - 1;
                }
                else
                    l = mid + 1;
            }
    
            printf("%d
    ", ans);
        }
        return 0;
    }


  • 相关阅读:
    Asp.Net Core MVC + Code First + Mysql 项目创建以及相关配置
    linux安装 docker compose v2
    压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题
    c# 通过经纬度 查询地址、区域信息
    excel 文件转 dataset ,jqgrid 中 模糊查询与下拉联动的实现
    jqgrid mvc 导出excel
    SQL学习笔记三表的字段操作
    SQL学习笔记高级教程
    安装docker
    SQL学习笔记一数据类型
  • 原文地址:https://www.cnblogs.com/w-y-1/p/5794871.html
Copyright © 2011-2022 走看看