82pts MLE求调!?
查看原帖
82pts MLE求调!?
1387277
zengyongxu追光楼主2025/6/30 20:02

莫名奇妙的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";
}

求求各位大佬了。

2025/6/30 20:02
加载中...