标签:
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 506 char str[N][N]; int w[N][N],aa[N*N],b[N*N],d,n,m; int a[4][2]= {{-1,0},{1,0},{0,1},{0,-1}}; struct node { int x,y; }; int qq(int x,int y) { memset(w,0,sizeof(w)); queue<node> Q; node q,p; q.x=x; q.y=y; Q.push(q); w[x][y]=1; while(Q.size()) { p=Q.front(); Q.pop(); if(p.x==n-1)///表示可以到底 return 1; for(int i=0; i<4; i++) { q.x=p.x+a[i][0]; q.y=p.y+a[i][1]; int e=q.x,f=q.y; if(e>=0&&e<n&&f>=0&&f<m&&!w[e][f]&&str[e][f]==‘0‘) { w[e][f]=1; Q.push(q); } } } return 0;///无到底的点 } void qqq(int x) { for(int i=1; i<=x; i++) str[aa[i]][b[i]]=‘0‘; } int q(int x) { for(int i=1; i<=x; i++) str[aa[i]][b[i]]=‘1‘; for(int j=0; j<m; j++) if(str[0][j]==‘0‘) { if(qq(0,j))///如果已经存在到底的点 则返回0 结束 return 0; } return 1; } int main() { int T,t; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%s",str[i]); scanf("%d",&t); for(int i=1; i<=t; i++) scanf("%d%d",&aa[i],&b[i]); int l=1,r=t,mid,ans=-1; while(l<=r) { mid=(l+r)/2; if(q(mid))///如果已经不满足 ans提取出来 继续减少范围 { ans=mid; r=mid-1; } else l=mid+1; qqq(mid);///因为你改变了一部分数 就重新改变过来 } printf("%d\n",ans); } return 0; }
深搜也可以的
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 506 char str[N][N]; int w[N][N],aa[N],b[N],d,n,m; int a[4][2]= {{-1,0},{1,0},{0,1},{0,-1}}; void qq(int x,int y) { if(d==1) return ; for(int i=0; i<4; i++) { int e=x+a[i][0]; int f=y+a[i][1]; if(e==n-1&&str[e][f]==‘0‘) { d=1; return ; } if(e>=0&&e<n&&f>=0&&f<m&&!w[e][f]&&str[e][f]==‘0‘) { w[e][f]=1; qq(e,f); } } return ; } void qqq(int x) { for(int i=1; i<=x; i++) str[aa[i]][b[i]]=‘0‘; } int q(int x) { for(int i=1; i<=x; i++) str[aa[i]][b[i]]=‘1‘; for(int j=0; j<m; j++) if(str[0][j]==‘0‘) { d=0; memset(w,0,sizeof(w)); qq(0,j); if(d==1) return 0; } return 1; } int main() { int T,t; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%s",str[i]); scanf("%d",&t); for(int i=1; i<=t; i++) scanf("%d%d",&aa[i],&b[i]); int l=1,r=t,mid,ans=-1; while(l<=r) { mid=(l+r)/2; if(q(mid)) { ans=mid; r=mid-1; } else l=mid+1; qqq(mid); } printf("%d\n",ans); } return 0; }
HDU 5652 二分加搜索 http://acm.split.hdu.edu.cn/showproblem.php?pid=5652
标签:
原文地址:http://www.cnblogs.com/a719525932/p/5789806.html