记录编号 570997 评测结果 AAAAAAAAAAAAAAAA
题目名称 32.[POI 1999] 位图 最终得分 100
用户昵称 lihaoze 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-04-30 21:16:34 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define OPEN(_x) freopen(#_x".in", "r", stdin); freopen(#_x".out", "w", stdout)
#define rep(_x, _y, _z) for (int _x = (_y); _x <= (_z); ++ _x)
#define rep1(_x, _y, _z) for (int _x = (_y); _x < (_z); ++ _x)
#define fi first
#define se second

using i64 = long long;
using PII = std::pair<int, int>;

int n, m;
int g[183][183];
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };
std::queue<PII> q;

bool is_valid(int x, int y) {
	return x >= 0 && x < n && y >= 0 && y < m;
}

int main() {
	OPEN(bit);
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cin >> n >> m;
	memset(g, 0x3f, sizeof g);
	rep1(i, 0, n) {
		std::string tmp;
		std::cin >> tmp;
		rep1(j, 0, m) if (tmp[j] == 49) {
			g[i][j] = 0;
			q.push({ i, j });
		}
	}
	while (q.size()) {
		PII t = q.front(); q.pop();
		rep1(i, 0, 4) {
			int nx = t.fi + dx[i];
			int ny = t.se + dy[i];
			if (is_valid(nx, ny)) 
				if (g[nx][ny] > g[t.fi][t.se] + 1) {
					g[nx][ny] = g[t.fi][t.se] + 1;
					q.push({ nx, ny });
				} 
		}
	}
	rep1(i, 0, n) {
		rep1(j, 0, m) printf("%d ", g[i][j]);
		puts("");
	}
	return 0;
}