View Code of Problem 3602

#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;

int T, n, m, tx[4] = {0, 0, 1, -1}, ty[4] = {1, -1, 0, 0};
char S[1100][1100];
bool used[1100][1100];
int xx[1100000], yy[1100000];

void bfs() {
	memset(used, false, sizeof used);
	used[1][1] = true;
	int q = 1, h = 1;
	xx[q] = yy[q] = 1;
	for (; q <= h; q++)
		if (S[xx[q]][yy[q]] == '0') {
			for (int i = 0; i < 4; i++) {
				int X = xx[q] + tx[i], Y = yy[q] + ty[i];
				if (X > 0 && X <= n && Y > 0 && Y <= m && !used[X][Y]) {
					h++;
					xx[h] = X;
					yy[h] = Y;
					used[X][Y] = true;
				}
			}
		}
	if (used[n][m] && S[n][m] == '0') {
		printf("0\n");
		return ;
	}
	int ma = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (used[i][j])
				ma = max(ma, i + j);
	printf("1");
	for (int i = ma; i < n + m; i++) {
		char mi = '1';
		for (int j = 1; j <= n; j++)
			if (1 <= i - j && i - j <= m && used[j][i - j]) {
				mi = min(mi, S[j + 1][i - j]);
				mi = min(mi, S[j][i - j + 1]);
			}
		printf("%c", mi);
		for (int j = 1; j <= n; j++)
			if (1 <= i - j && i - j <= m && used[j][i - j]) {
				if (S[j + 1][i - j] == mi) used[j + 1][i - j] = true;
				if (S[j][i - j + 1] == mi) used[j][i - j + 1] = true;
			}
	}
	printf("\n");
}

int main() {
	// freopen("a.in", "r", stdin);
	// freopen("a.out", "w", stdout);
	
	scanf("%d", &T);
	while (T--) {
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; i++)
			scanf("%s", S[i] + 1);
		for (int i = 0; i <= n + 1; i++)
			S[i][0] = '2', S[i][m + 1] = '2';
		for (int i = 0; i <= m + 1; i++)
			S[0][i] = '2', S[n + 1][i] = '2';
		bfs();
	}
}

Double click to view unformatted code.


Back to problem 3602