代码如下(经过了deepseek缩时过的代码,赛事没用):
#include <cstdio>
#include <queue>
using namespace std;
const int N = 1001;
int a[N][N], T, n, m, c;
long long k, s, copyuki[N][N];
inline int read() {
int x = 0, sign = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') sign = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch - '0');
ch = getchar();
}
return x * sign;
}
int main() {
c = read(), T = read();
while (T--) {
n = read(), m = read(), s = read(), k = read();
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
a[i][j] = read(), copyuki[i][j] = -1;
priority_queue<pair<long long, pair<int, int>>> pq;
// 处理初始位置(第一行的每个格子)
for (int j = 0; j < m; ++j) {
long long current = s + a[0][j]; // 初始位置也要变化
if (current < 0) continue;
if (current > k) current = k;
if (current > copyuki[0][j]) {
copyuki[0][j] = current;
pq.push({current, {0, j}});
}
}
long long ans = -1;
int dr[3][2] = {{0, -1}, {0, 1}, {1, 0}};
while (!pq.empty() && ans < k) {
auto [mor, p] = pq.top(); pq.pop();
auto [i, j] = p;
if (i == n - 1) {
ans = max(ans, mor);
continue;
}
if (mor < copyuki[i][j]) continue;
for (int d = 0; d < 3; ++d) {
int ni = i + dr[d][0], nj = j + dr[d][1];
if (ni < 0 || ni >= n || nj < 0 || nj >= m) continue;
long long nm = mor + a[ni][nj];
if (nm < 0) continue;
if (nm > k) nm = k;
if (nm > copyuki[ni][nj]) {
copyuki[ni][nj] = nm;
pq.push({nm, {ni, nj}});
}
}
}
printf("%lld\n", ans);
}
return 0;
}
保留了AI留下的注释