India and China Origins

题目链接:India and China Origins 

思路:

每过一段时间就有一个格子不能走,按学长题解所说,就是当在t时刻可以从顶端走到底端,那么t时刻前都可以走到;反之在t时刻走不到,那么t时刻后都走不到,因此可以二分时间搜索判断

代码:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm> 
using namespace std;
const int maxn=510;
char str[maxn][maxn];
int maze[maxn][maxn];
int change[maxn][maxn];
int vis[maxn][maxn];
int n,m,q;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct  node
{
    int x,y;
}nod[maxn*maxn];
bool dfs(int x,int y){
    vis[x][y]=1;
    if(x==n-1) return true;
    for(int i=0;i<4;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>=0&&nx<n&&ny>=0&&ny<m&&change[nx][ny]==0&&!vis[nx][ny]){
            if(dfs(nx,ny)) return true;
        }
    }
    return false;
}
bool judge(int years){
    memcpy(change,maze,sizeof(maze));
    for(int i=1;i<=years;i++){
        change[nod[i].x][nod[i].y]=1;
    }
    memset(vis,0,sizeof(vis));
    for(int i=0;i<m;i++){
        if(!vis[0][i]&&change[0][i]==0){
            if(dfs(0,i)) return true;
        }
    }
    return false;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%s",str[i]);
            for(int j=0;j<m;j++) maze[i][j]=str[i][j]-'0';
        }
        scanf("%d",&q);
        for(int i=1;i<=q;i++){
            scanf("%d%d",&nod[i].x,&nod[i].y);
        }
        int l=0,r=q;
        while(l<r){
            int mid=(l+r)>>1;
            if(judge(mid)){
                l=mid+1;
            }else{
                r=mid;
            }
        }
        printf("%d\n",l);
    }
}

猜你喜欢

转载自www.cnblogs.com/KasenBob/p/10890558.html
今日推荐