#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a[505][505];
int sta[505][505];
bool vis[505][505];
pair<int, int> q[505 * 505];
int hh, tt;
int n, m;
int t;
int tiaoguo;
int dx[4] = { 0,-1,1,0 };
int dy[4] = { -1,0,0,1 };
bool bfs(int x, int y, int mid)
{
int f = 1;
q[0] = { x,y };
vis[x][y] = true;
while (hh <= tt)
{
auto Q = q[hh++];
for (int i = 0; i < 4; i++)
{
int xx = Q.first + dx[i];
int yy = Q.second + dy[i];
if (xx < 0 || xx >= n || yy < 0 || yy >= m)
{
continue;
}
if (abs(a[xx][yy] - a[Q.first][Q.second]) > mid)
{
continue;
}
if (vis[xx][yy])
{
continue;
}
if (sta[xx][yy] == 1)
{
f++;
if (f == t)
{
return true;
}
}
q[++tt] = { xx,yy };
vis[xx][yy] = true;
}
}
return false;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> sta[i][j];
if (sta[i][j] == 1)
{
t++;
}
}
}
for (int i = 0; i < n; i++)
{
if (tiaoguo)
{
break;
}
for (int j = 0; j < m; j++)
{
if (sta[i][j] == 1)
{
int l = -1, r = 1e9 + 1;
while (l < r)
{
int mid = (l + r )/ 2;
memset(vis, false, sizeof(vis));
memset(sta, 0, sizeof(sta));
memset(q, 0, sizeof(q));
hh = 0, tt = 0;
if (bfs(i, j, mid))
{
r = mid;
}
else
{
l = mid + 1;
}
}
cout << l;
tiaoguo = 1;
break;
}
}
}
return 0;
}
感谢大佬!!!