思路:
每过一段时间就有一个格子不能走,按学长题解所说,就是当在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); } }
原文:https://www.cnblogs.com/KasenBob/p/10890558.html