标签:
题意:给出一个01矩阵,从左上角走到右下角,问路径形成的二进制最小是多少。
这个题目很显然,但是我的做法还是很有意思的,于是写下。
很显然,为了去掉前导0的影响,首先爆搜出所有离终点最近的点然后压入队列开始爆搜,此时只需要往下往右走即可。
爆搜的时候每次处理出下一层的所有状态,若能够出现0,则不考虑其他为1的情况,这样只需要维护两个数组即可,很方便。
#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> #include<stack> #include<set> using namespace std; int tor[4]={-1,1,0,0}; int toc[4]={0,0,-1,1}; struct point { int r,c; point(){} point(int r,int c) { this->r=r; this->c=c; } }; char s[1010][1010]; bool vis[1010][1010]; point q[2][1000010]; int len[2]; int n,m,x; bool beyond(int r,int c) { return r<0||c<0||r>=n||c>=m; } void seek() { memset(len,0,sizeof(len)); q[0][len[0]++]=point(0,0); if(s[0][0]=='1') { x=1; return; } x=0; q[1][len[1]++]=point(0,0); memset(vis,0,sizeof(vis)); vis[0][0]=1; int mx=0; while(len[1]>0) { point from=q[1][--len[1]]; int r=from.r,c=from.c; for(int i=0;i<4;i++) { int tr=r+tor[i],tc=c+toc[i]; if(beyond(tr,tc)||vis[tr][tc]||s[tr][tc]!='0') continue; vis[tr][tc]=1; int t=tr+tc; if(t>=mx) { if(t>mx) len[0]=0; mx=t; q[0][len[0]++]=point(tr,tc); } q[1][len[1]++]=point(tr,tc); } } } int ans[10000]; int bfs() { bool p=0; memset(vis,0,sizeof(vis)); for(int i=0;;i++) { int j=i%2; bool flag=0; while(len[j]>0) { len[j]--; int r=q[j][len[j]].r,c=q[j][len[j]].c; if(s[r][c]=='1'&&p) continue; for(int k=0;k<4;k++) if(k&1) { int tr=r+tor[k],tc=c+toc[k]; if(beyond(tr,tc)||vis[tr][tc]) continue; vis[tr][tc]=1; q[j^1][len[j^1]++]=point(tr,tc); if(s[tr][tc]=='0') flag=1; } } p=flag; ans[i]=flag?0:1; if(vis[n-1][m-1]) return i; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); seek(); if(x==0&&vis[n-1][m-1]) { printf("0\n"); continue; } if(x==1) { putchar('1'); if(n==1&&m==1) { puts(""); continue; } } int lg=bfs(); for(int i=0;i<=lg;i++) printf("%d",ans[i]); puts(""); } return 0; }
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 707 Accepted Submission(s): 127
2 2 2 11 11 3 3 001 111 101
111 101
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stl112514/article/details/47156819