网站图标 代码,北京网站设计济南兴田德润评价,山东济南网站建设公司哪家好,什么叫外链算法提高课整理
CSDN个人主页#xff1a;更好的阅读体验 本文同步发表于 CSDN | 洛谷 | AcWing | 个人博客 原题链接
题目描述
给定一个 01 矩阵#xff0c;求矩阵中每个元素离 1 的最短曼哈顿距离。
输入格式
第一行两个整数 n , m n,m n,m。
接下来一个 n n n 行 …算法提高课整理
CSDN个人主页更好的阅读体验 本文同步发表于 CSDN | 洛谷 | AcWing | 个人博客 原题链接
题目描述
给定一个 01 矩阵求矩阵中每个元素离 1 的最短曼哈顿距离。
输入格式
第一行两个整数 n , m n,m n,m。
接下来一个 n n n 行 m m m 列的 01 矩阵数字之间没有空格。
输出格式
一个 n n n 行 m m m 列的矩阵相邻数字之间用空格隔开。
数据范围 1 ≤ n , m ≤ 1000 1\le n,m\le 1000 1≤n,m≤1000 思路
先考虑从 0 的位置向外扩展。
发现这样的话较麻烦于是改为考虑从 1 的位置用 BFS 向外扩展并处理出所有的距离。
这种算法即为 “多源 BFS”。具体算法流程为将所有源点都入队然后正常跑 BFS。
具体细节见代码。
算法时间复杂度
AC Code C \text{C} C #include iostream
#include cstring
#include queueusing namespace std;typedef pairint, int PII;
#define x first
#define y secondconst int N 1010;
int dx[] {-1, 0, 1, 0};
int dy[] {0, 1, 0, -1};int n, m;
char g[N][N];
int dist[N][N];void bfs()
{memset(dist, -1, sizeof dist);queuePII q;for (int i 0; i n; i )for (int j 0; j m; j )if (g[i][j] 1)dist[i][j] 0, q.push({i, j}); // 所有起点入队while (q.size()){PII t q.front();q.pop();for (int i 0; i 4; i ) // 4方向扩展{int x t.x dx[i], y t.y dy[i];if (x 0 || x n || y 0 || y m) continue; // 出界if (dist[x][y] ! -1) continue; // 已经被遍历过dist[x][y] dist[t.x][t.y] 1; // 合法的话更新距离q.push({x, y}); // 新点入队}}
}int main()
{scanf(%d%d, n, m);for (int i 0; i n; i )scanf(%s, g[i]);bfs();for (int i 0; i n; i ){for (int j 0; j m; j )printf(%d , dist[i][j]);puts();}return 0;
}最后如果觉得对您有帮助的话点个赞再走吧