标签:
/* 题意:从左上到右下要求二进制最小,删去前置0 贪心+bfs 先用bfs求出前置0的长度 再以距离为状态进行贪心 */ #include <bits/stdc++.h> using namespace std; int dirx[] = {1, -1, 0, 0}; int diry[] = {0, 0, 1, -1}; const int MAX = 1000 + 10; char a[MAX][MAX]; int vis[MAX][MAX]; int b[MAX][MAX]; typedef struct { int x, y; }P; queue <P> q; int n, m; int main() { int T; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &m); memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) scanf("%s", a[i]+1); for(int i = 0; i <= n; i++) b[i][0] = b[i][m+1] = 2; for(int i = 0; i <= m; i++) b[0][i] = b[n+1][i] = 2; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ b[i][j] = a[i][j]-‘0‘; } } vis[1][1] = 1; if(b[1][1] == 0){ while(!q.empty()) q.pop(); q.push((P){1, 1}); while(!q.empty()){ P now = q.front(); q.pop(); int x = now.x; int y = now.y; for(int i = 0 ; i< 4; i++){ int X = x + dirx[i], Y = y + diry[i]; if(X >= 1 && X <= n && Y >= 1 && Y <= m && !vis[X][Y] && b[X][Y] == 0){ vis[X][Y] = 1; q.push((P){X, Y}); } } } } // for(int i = 1; i <= n; i++){ // for(int j = 1; j <= m; j++) // printf("%d",vis[i][j]); // puts(""); // } if(vis[n][m] && b[n][m] == 0) { printf("0\n"); continue; } if(b[1][1] == 1) printf("1"); int max_dis = 2; for(int i = 1; i <= n ; i++) for(int j = 1; j <= m; j++) if(vis[i][j]) max_dis = max(max_dis, i+j); for(int i = max_dis; i < n + m; i++){ int min1 = 1; for(int j = 1; j <= n; j++) if(i - j >= 1 && i - j <= m && vis[j][i-j]) min1 = min(min1,min(b[j+1][i-j], b[j][i-j+1])); printf("%d", min1); for(int j = 1; j <= n; j++) if(i - j >= 1 && i - j <= m && vis[j][i-j]){ if(b[j+1][i-j] == min1) vis[j+1][i-j] = 1; if(b[j][i-j+1] == min1) vis[j][i-j+1] = 1; } } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4694125.html