__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