题目描述
原文理解
曼哈顿距离
投影到坐标轴长度的和
、
红色的线为曼哈顿距离
题解
#include <cstring> #include <iostream> #define x first #define y second using namespace std; typedef pair<int, int> pii; const int N = 1010; int n, m; int dist[N][N]; pii q[N * N]; char g[N][N]; void bfs() { int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0}; memset(dist, -1, sizeof dist); int tt = 0, hh = 0; for( int i = 0; i < n; i ++ ) for( int j = 0; j < m; j ++ ) if( g[i][j] == '1' ) { dist[i][j] = 0; q[tt ++] = {i, j}; } while( hh < tt ) { pii cur = q[hh ++]; int x = cur.x, y = cur.y; for( int i = 0; i < 4; i ++ ) { int nx = x + dx[i], ny = y + dy[i]; if( nx < 0 || nx >= n || ny < 0 || ny >= m ) continue; if( dist[nx][ny] != -1 ) continue; dist[nx][ny] = dist[x][y] + 1; q[tt ++] = {nx, ny}; } } } int main() { cin >> n >> m; for( int i = 0; i < n; i ++ ) cin >> g[i]; bfs(); for( int i = 0; i < n; i ++ ) { for( int j = 0; j < m; j ++ ) cout << dist[i][j] << ' '; cout << endl; } return 0; }