1 条题解

  • 1
    @ 2025-5-16 15:08:34

    题意:

    在一个表格里给出几个点的坐标 从开始点出发,分别经过给出的坐标点,并且在经过最后的一个点的时候再返回到开始点,问最短的步数是多少,只能上下左右移动……

    题解:

    DFSDFS深搜,分别搜到每一个点,最后求最短的路径……(开始的时候用BFSBFS做的,本来想可以进行全排列后 ,找出从一个点到下一个点的最短路径 ,最后再加起来,若起点在给出的点的中间的话,并不符合题意,所以用DFSDFS直接遍历每一个给出的坐标,最后在找出最短路径……)

    标程

    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    #include <cmath>
    using namespace std;
    
    struct node {
        int x, y;
    };
    
    int X, Y;
    int N;
    int maxstep;
    const int maxn = 100;
    int vis[300];
    int map[maxn][maxn];
    node ps[maxn];
    
    int distance1(int i, int j) {
        int dx = ps[i].x - ps[j].x;
        int dy = ps[i].y - ps[j].y;
        dx = dx > 0 ? dx : -dx;
        dy = dy > 0 ? dy : -dy;
        return dx + dy;
    }
    
    void dis(int X, int Y) {
        int m, n;
        for (m = 0; m < X; m++) {
            for (n = 0; n < Y; n++) {
                // 修正:这里应该计算点m和点n之间的距离
                map[m][n] = distance1(m, n);
            }
        }
    }
    
    inline int dist(int i, int j) {
        return map[i][j];
    }
    
    void dfs(const int start, const int level, const int disyuan) {
        if (level == N) {
            int temp = disyuan + dist(start, 0);
            maxstep = temp < maxstep ? temp : maxstep;
            return;
        }
        for (int i = 1; i <= N; i++) {
            if (vis[i] == 0) {
                vis[i] = 1;
                dfs(i, level + 1, disyuan + dist(i, start));
                vis[i] = 0;
            }
        }
    }
    
    int main() {
        int T;
        cin >> T;
        while (T--) {
            cin >> X >> Y;
            cin >> ps[0].x >> ps[0].y;
            cin >> N;
            
            int i; // C++98要求变量声明在作用域开始处
            for (i = 1; i <= N; i++) {
                cin >> ps[i].x >> ps[i].y;
            }
            
            // 修正:计算所有点之间的距离,而不是整个网格
            for (i = 0; i <= N; i++) {
                for (int j = 0; j <= N; j++) {
                    map[i][j] = distance1(i, j);
                }
            }
            
            maxstep = 999999999;
            memset(vis, 0, sizeof(vis));
            dfs(0, 0, 0);
            
            cout << "The shortest path has length " << maxstep << endl;
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    1908
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者