走一个大整数迷宫

走一个大整数迷宫

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll MOD;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};

struct status {
    int x, y, r, dist;
};

void solve() {
    int n, m, p; cin >> n >> m >>p;
    MOD = p - 1;
    vector<vector<int>> c(n + 1, vector<int>(m + 1, 0));
    for(int i = 1; i <= n; i ++) for(int j = 1; j <= m; j ++) {cin >> c[i][j]; c[i][j]%=MOD;}
    ll b;
    for(int i = 1; i <= n; i ++) for(int j = 1; j <= m; j ++) cin >> b;
    if(n == 1 && m == 1 && c[1][1] == 0) {cout << "0\n"; return;}

    vector<vector<vector<int>>> vis(n + 1, vector<vector<int>>(m + 1, vector<int>(p, 0)));
    queue<status> q; vis[1][1][c[1][1]] = 1;
    q.push({1, 1, c[1][1], 0});
    while(!q.empty()) {
        auto [x, y, r, dist] = q.front(); q.pop();
        //cout << "TEST " << x << " " << y <<" " << r << " " << dist << "\n";
        for(int d = 0; d < 4; d ++) {
            int tx = x + dx[d], ty = y + dy[d];
            if(tx <= 0 || ty <= 0 || tx > n || ty > m) continue;
            int res = (r + c[tx][ty]) % MOD;
            if(vis[tx][ty][res]) continue;

            if(tx == n && ty == m && res == 0) {cout << dist + 1 << "\n"; return; }
            q.push({tx, ty, res, dist + 1});
            vis[tx][ty][res] = 1;
        }
    }
    cout << "-1\n";
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int _=1; //cin >> _;
    while(_--) solve();
    return 0;
}
posted @ 2026-11-03 22:12  thenrify  阅读(3)  评论(0)    收藏  举报