标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1977 Accepted Submission(s):
373
#include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> #include <queue> #include <queue> #define SIZE 1005 #define maxn 2010 using namespace std; int n,m; char Map[SIZE][SIZE]; int visit[SIZE][SIZE]; int d[SIZE][SIZE]; int VIS[maxn][maxn]; int tot; int dir[4][2]={0,-1,0,1,-1,0,1,0}; struct node { int x,y,cnt; }; queue <node> que; void init() { tot=1; memset(visit,0,sizeof(visit)); memset(d,0,sizeof(d)); memset(VIS,0,sizeof(VIS)); } void dfs(int x,int y) { if(visit[x][y]==1) return ; visit[x][y]=1; if(Map[x][y]==‘1‘) return ; d[x][y]=1; if(x+y>tot) tot=x+y; if(x>1) dfs(x-1,y); if(x<n) dfs(x+1,y); if(y>1) dfs(x,y-1); if(y<m) dfs(x,y+1); } void bfs() { if(Map[1][1]==‘0‘) { node a,b,c; a.x=1; a.y=1; a.cnt=2; que.push(a); VIS[1][1]=1; d[1][1]=1; while(!que.empty()) { b=que.front(); que.pop(); if(b.cnt > tot) tot=b.cnt; for(int i=0;i<4;i++) { int next_x=b.x+dir[i][0]; int next_y=b.y+dir[i][1]; if( (1<=next_x) &&(next_x<=n) && (1<=next_y) && (next_y<=m) && VIS[next_x][next_y]==0 && Map[next_x][next_y]==‘0‘) { c.x=next_x; c.y=next_y; c.cnt=next_x+next_y; que.push(c); VIS[next_x][next_y]=1; d[next_x][next_y]=1; } } } } else return ; } void solve() { if(tot==m+n) { printf("0\n"); return ; } if(tot==1) { tot=2; //代表起始点为(1,1) d[1][1]=1; printf("1"); } for(int p=tot;p<n+m;p++) { int flag=1; for(int q=max(p-m,1);q<=min(p-1,n);q++) //q代表行号 { if(d[q][p-q]) { int x=(Map[q][p-q+1]-‘0‘)?1:0; int y=(Map[q+1][p-q]-‘0‘)?1:0; flag=min(flag,x); flag=min(flag,y); } } for(int q=max(p-m,1);q<=min(p-1,n);q++) { if(d[q][p-q]) { int x=(Map[q][p-q+1]-‘0‘)?1:0; int y=(Map[q+1][p-q]-‘0‘)?1:0; if(x==flag) d[q][p-q+1]=1; if(y==flag) d[q+1][p-q]=1; } } printf("%d",flag); } printf("\n"); } int main() { //freopen("test.txt","r",stdin); int t; scanf("%d",&t); while(t --) { init(); scanf("%d%d%*c",&n,&m); // printf("%d %d %d\n",n,m,tot); for(int i = 1 ; i <= n ; i ++) { scanf("%s",&Map[i][1]); } // getchar(); //dfs(1,1); bfs(); // printf("tot: %d\n",tot); solve(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/xianbin7/p/4692701.html