1 minute read

7576

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

const int MAX = 1001;
const int dx[] = { 0,0,-1,1 };
const int dy[] = { -1,1,0,0 };

int n, m;
int cnt = 0;
int one = true;
int mat[MAX][MAX];
int visited[MAX][MAX];
queue<pair<int, int> > q;

int main() {
	int i, j, x, y;
	
	scanf("%d %d", &m, &n);
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			scanf("%d", &mat[i][j]);
			visited[i][j] = -1;
			
			if (mat[i][j] == 0) one = false;
			else if (mat[i][j] == 1) {
				q.push({i,j});
				visited[i][j] = 0;
			}
		}
	}
	
	if (one) {
		printf("0");
		return 0;
	}
	else {
		while(!q.empty()) {
			x = q.front().first;
			y = q.front().second;
			q.pop();
			
			for (i = 0; i < 4; i++) {
				int nx = x + dx[i];
				int ny = y + dy[i];
				if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
					if (mat[nx][ny] == 0 && visited[nx][ny] == -1) {
						visited[nx][ny] = visited[x][y] + 1;
						q.push({nx, ny});
					}
				}
			}
		}
		
		for (i = 0; i < n; i++) {
			for (j = 0; j < m; j++) {
				cnt = max(cnt, visited[i][j]);
			}
		}
		
		for (i = 0; i < n; i++) {
			for (j = 0; j < m; j++) {
				if(mat[i][j] == 0 && visited[i][j] == -1) {
					printf("-1");
					return 0;
				}
			}
		}
		printf("%d", cnt);
	}
	return 0;
}

Categories:

Updated: