标签:
/*
题意:从左上到右下要求二进制最小,删去前置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