记忆化搜索最后一个点wa

P2895 [USACO08FEB] Meteor Shower S

__dislike @ 2024-03-30 23:28:38

记忆化搜索

最后一个点过不了,求大佬看看

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 
const int N = 50010; 
int m, ans = INT_MAX; 
// int t[N]; 
vector<vector<bool>> mp(310, vector<bool>(310, true)); 
vector<vector<int>> Time(310, vector<int>(310, INT_MAX));  // 流星落下的时间
vector<vector<int>> memo(310, vector<int>(310, INT_MIN));  // 初始化记忆数组
int dx[] = {1, -1, 0, 0}; 
int dy[] = {0, 0, 1, -1}; 

void dfs(int x, int y, int cnt) {
    if(x < 0 || y < 0 || x > 300 || y > 300 || cnt >= Time[x][y] || cnt >= ans || memo[x][y] != INT_MIN && cnt >= memo[x][y]) return;  // || visited[x][y] != INT_MIN
    if(mp[x][y]) {
        ans = min(ans, cnt); 
        return; 
    }
    memo[x][y] = cnt;  // 记忆化搜索
    for(int i = 0; i < 4; ++i) {
        dfs(x + dx[i], y + dy[i], cnt + 1); 
    }
    return; 
}

void solve() {
    cin >> m; 
    for(int i = 0; i < m; ++i) {
        int x, y, t; 
        cin >> x >> y >> t; 
        Time[x][y] = min(Time[x][y], t);  // 关键容易忽略,不加有可能被覆盖
        mp[x][y] = false; 
        for(int j = 0; j < 4; ++j) {
            int next_x = x + dx[j]; 
            int next_y = y + dy[j]; 
            if(next_x >= 0 && next_y >= 0 && next_x <= 300 && next_y <= 300) {
                mp[next_x][next_y] = false; 
                Time[next_x][next_y] = min(Time[next_x][next_y], t); 
            }
        }
    }
    // for(int i = 0; i < 10; ++i) {
    //     for(int j = 0; j < 10; ++j) {
    //         cout << mp[i][j] << '\t'; 
    //     }
    //     cout << endl; 
    // }
    // cout << endl; 
    // for(int i = 0; i < 10; ++i) {
    //     for(int j = 0; j < 10; ++j) {
    //         cout << Time[i][j] << "\t"; 
    //     }
    //     cout << endl; 
    // }
    dfs(0, 0, 0); 
    if(ans != INT_MAX) cout << ans; 
    else cout << -1; 
    return; 
}
int main() {
    int t; 
    // cin >> t; 
    t = 1; 
    while(t--) {
        solve(); 
    }
    return 0; 
}

by spencer @ 2024-03-31 07:59:04

应该是因为没考虑人可以跑到300以外的地方


by __dislike @ 2024-03-31 20:48:25

@spencer 感谢大佬,过了,但是明明题目说的是300呀。。。


by spencer @ 2024-03-31 21:29:03

@__dislike 我当时也因为这个被卡了好久qwq


|