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;
}


原文地址:https://www.cnblogs.com/w-y-1/p/5794871.html