一.题目链接:
矩阵距离
二.题目大意:
给你一个 n × m 的 01 矩阵 A,现求矩阵 B.
三.分析:
每个点 BFS 肯定会 T.
一开始想的是从 (1,1)开始搜,记一下曼哈顿距离,之后二分查找做差,写完之后发现思路根本不对。。。
正解是把每个 1 在一开始加到队列里去,然后 BFS 即可. (wsl)
四.代码实现:
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;
const int M = (int)1e3;
const int mod = 99991;
const int inf = 0x3f3f3f3f;
int n, m;
char s[M + 5][M + 5];
int step[M + 5][M + 5];
pair <int, int> p, t;
queue < pair<int, int> > q;
int dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0};
void bfs()
{
memset(step, -1, sizeof(step));
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
if(s[i][j] == '1')
{
step[i][j] = 0;
p.first = i, p.second = j;
q.push(p);
}
}
}
while(!q.empty())
{
p = q.front(), q.pop();
for(int i = 0; i < 4; ++i)
{
t = p;
t.first += dx[i], t.second += dy[i];
if(t.first >= 1 && t.first <= n && t.second >= 1 && t.second <= m && step[t.first][t.second] == -1)
{
step[t.first][t.second] = step[p.first][p.second] + 1;
q.push(t);
}
}
}
}
/**
2 2
00
11
**/
int main()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
scanf("%s", s[i] + 1);
bfs();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
printf("%d%c", step[i][j], j == m ? '\n' : ' ');
return 0;
}