1 条题解

  • 0
    @ 2025-3-30 14:35:53

    此题是一个比较裸的dfs题目,主要的变化在于路径中不可以出现交叉的线路,如果考虑 (x,y)-->(a,b), 需要看是否存在 (x,b)<-->(a,y),数据范围较小,使用标记 ch[x][y][a][b] 表示 是否存在 (a,y)-->(a,b) 的情况。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 11, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    int n, m, k, d[][2] = {-1, 0, -1, 1, 0, 1, 1, 1, 1, 0, 1, -1, 0, -1, -1, -1};
    int s[N][N];
    bool st[N][N], ch[N][N][N][N], fg = 0;
    string ans;
    
    void dfs(int x, int y, string path) {
        if (x == n - 1 && y == n - 1 || fg) {
            if (path.size() == n * n - 1)
                cout << path << endl, fg = 1, exit(0);
            return;
        }
        st[x][y] = 1;
        for (int i = 0; i < 8; i++) {
            int a = x + d[i][0], b = y + d[i][1];
            if (a < 0 || a >= n || b < 0 || b >= n) continue;
            if (st[a][b] || s[a][b] != (s[x][y] + 1) % k) continue;
            if (i % 2 && (ch[x][b][a][y] || ch[a][y][x][b])) continue;
            ch[x][y][a][b] = 1;
            dfs(a, b, path + to_string(i));
            ch[x][y][a][b] = 0;
        }
        st[x][y] = 0;
    }
    void solve() {
        cin >> n >> k;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) cin >> s[i][j];
        dfs(0, 0, "");
        if (!fg) cout << "-1\n";
    }
    signed main(signed argc, char* argv[]) {
        int t = 1;  // cin>>t;
        while (t--) {
            solve();
        }
        return 0;
    }
    
    • 1

    信息

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