0分求调
查看原帖
0分求调
1069285
Sutong123楼主2025/7/28 10:13
#include <bits/stdc++.h>
using namespace std;
long long c, t;
long long a[1010][1010];
long long f[1010][1010];
inline bool calc (long long x, long long y, long long n, long long m) {
	if (x >= 1 && x <= n && y >= 1 && y <= m)
		return true;
	else
		return false;
}
inline void bfs (long long start, long long n, long long m, long long s, long long k) {
	queue <pair <long long, long long>> p;
	memset (f, 0, sizeof (f));
	f[1][start] = s + a[1][start];
	if (f[1][start] < 0)
		return;
	p.push ({1, start});
	while (!p.empty()) {
		pair <long long, long long> x = p.front();
		p.pop();
		long long xx = x.first;
		long long yy = x.second;
		if (calc (xx + 1, yy, n , m) && f[xx][yy] + a[xx + 1][yy] >= 0 && f[xx][yy] + a[xx + 1][yy] > f[xx + 1][yy]) {
			p.push ({xx + 1, yy});
			f[xx + 1][yy] = f[xx][yy] + a[xx + 1][yy];
			if (f[xx + 1][yy] > k)
				f[xx + 1][yy] = k;
		}
		if (calc (xx, yy + 1, n , m) && f[xx][yy] + a[xx][yy + 1] >= 0 && f[xx][yy] + a[xx][yy + 1] > f[xx][yy + 1]) {
			p.push ({xx, yy + 1});
			f[xx][yy + 1] = f[xx][yy] + a[xx][yy + 1];
			if (f[xx][yy + 1] > k)
				f[xx][yy + 1] = k;
		}
		if (calc (xx, yy - 1, n , m) && f[xx][yy] + a[xx][yy - 1] >= 0 && f[xx][yy] + a[xx][yy - 1] > f[xx][yy - 1]) {
			p.push ({xx, yy - 1});
			f[xx][yy - 1] = f[xx][yy] + a[xx][yy - 1];
			if (f[xx][yy - 1] > k)
				f[xx][yy - 1] = k;
		}
	}
}
int main() {
	freopen("journey2.in", "r", stdin);
	scanf ("%lld%lld", &c, &t);
	while (t--) {
		long long n, m, s, k;
		scanf ("%lld%lld%lld%lld", &n, &m, &s, &k);
		for (long long i = 1; i <= n; i++)
			for (long long j = 1; j <= m; j++)
				scanf ("%lld", &a[i][j]);
		long long mi = 0;
		for (long long start = 1; start <= m; start++) {
			bfs (start, n, m, s, k);
			long long ma = 0;
			for (long long i = 1; i <= m; i++)
				ma = max (f[n][i], ma);
			mi = max (ma, mi);
		}
		if (mi == 0)
			printf ("-1\n");
		else 
			printf("%lld\n", mi);
	}
	return 0;
}

样例过了

2025/7/28 10:13
加载中...