莫名奇妙的MLE了
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int n, m, id, ans1, ans2;
int a[N][N], dis[5][5], dist[5];
char mp[N][N];
struct node
{
int x, y;
};
void bfs(int sx, int sy)
{
queue<node> q;
q.push({sx, sy});
while (q.size())
{
auto [x, y] = q.front();
q.pop();
a[x][y] = id;
for (int u = 0; u < 4; u++)
{
int nx = x + dx[u];
int ny = y + dy[u];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !a[nx][ny] && mp[nx][ny] == 'X')
{
q.push({nx, ny});
}
}
}
}
int d(int i, int j, int x, int y)
{
return abs(i - x) + abs(j - y);
}
int main()
{
ans1 = ans2 = 0x3f3f3f3f;
memset(dis, 0x3f, sizeof(dis));
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> mp[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] == 0 && mp[i][j] == 'X')
{
id++;
bfs(i, j);
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (mp[i][j] == '.')
{
dist[1] = dist[2] = dist[3] = dist[4] = 0x3f3f3f3f;
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= m; y++)
{
dist[a[x][y]] = min(dist[a[x][y]], d(i, j, x, y) - 1);
}
}
ans2 = min(ans2, dist[1] + dist[2] + dist[3] + 1);
}
else
{
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= m; y++)
{
if (a[i][j] != a[x][y])
{
dis[a[i][j]][a[x][y]] = min(dis[a[i][j]][a[x][y]], d(i, j, x, y) - 1);
dis[a[x][y]][a[i][j]] = min(dis[a[x][y]][a[i][j]], d(i, j, x, y) - 1);
}
}
}
}
}
}
for (int i = 1; i <= 3; i++)
{
int tmp = 0;
for (int j = 1; j <= 3; j++)
{
if (i != j)
{
tmp += dis[i][j];
}
}
ans1 = min(ans1, tmp);
}
cout << min(ans1, ans2) << "\n";
}
求求各位大佬了。