結果

提出番号 1004
提出者 olphe
言語 C++
提出日時 2017-08-05 23:07:40
問題名 (44)玉ねぎの収穫をするkotamanegi
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 35ms 26432KB
2 AC 100% 31ms 25424KB
3 AC 100% 63ms 26432KB
4 AC 100% 54ms 26416KB
5 AC 100% 60ms 26432KB
6 AC 100% 31ms 27872KB
7 AC 100% 5ms 24672KB
8 AC 100% 71ms 27872KB
9 AC 100% 30ms 26416KB
10 AC 100% 11ms 26416KB
11 AC 100% 17ms 26416KB
12 AC 100% 17ms 24864KB
13 AC 100% 63ms 26416KB
14 AC 100% 5ms 25008KB
15 AC 100% 83ms 27872KB
16 AC 100% 6ms 24864KB
17 AC 100% 25ms 26432KB
18 AC 100% 39ms 26432KB
19 AC 100% 19ms 27872KB
20 AC 100% 7ms 24688KB

ソースコード

#include "iostream"
#include "climits"
#include "queue"
#include "functional"

using namespace std;
int main() {
	int H, W;
	cin >> H >> W;
	int y, x;
	cin >> y >> x;
	int cost_y[1001] = {};
	int cost_x[1001] = {};
	for (int j = 1; j <= H; j++) {
		cin >> cost_y[j];
	}
	for (int j = 1; j <= W; j++) {
		cin >> cost_x[j];
	}
	int yl, yr, xl, xr;
	cin >> yl >> yr >> xl >> xr;
	int dis[1002][1002] = {};
	bool flag[1002][1002] = {};
	for (int j = 1; j <= H; j++) {
		for (int k = 1; k <= W; k++) {
			dis[j][k] = INT_MAX;
			flag[j][k] = true;
		}
	}
	for (int j = yl; j <= yr; j++) {
		for (int k = xl; k <= xr; k++) {
			flag[j][k] = false;
		}
	}
	priority_queue < pair<int, pair<int, int>>, vector < pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>>Q;
	Q.push({ 0,{ 1,1 } });
	while (!Q.empty()) {
		int cy, cx, c;
		c = Q.top().first;
		cy = Q.top().second.first;
		cx = Q.top().second.second;
		Q.pop();
		if (dis[cy][cx] < c)continue;
		dis[cy][cx] = c;
		if (cy == y&&cx == x)break;
		if (flag[cy + 1][cx]) {
			if (c + cost_x[cx] < dis[cy + 1][cx]) {
				dis[cy + 1][cx] = c + cost_x[cx];
				Q.push({ dis[cy + 1][cx] ,{ cy + 1,cx } });
			}
		}
		if (flag[cy - 1][cx]) {
			if (c + cost_x[cx] < dis[cy - 1][cx]) {
				dis[cy - 1][cx] = c + cost_x[cx];
				Q.push({ dis[cy - 1][cx] ,{ cy - 1,cx } });
			}
		}
		if (flag[cy][cx + 1]) {
			if (c + cost_y[cy] < dis[cy][cx + 1]) {
				dis[cy][cx + 1] = c + cost_y[cy];
				Q.push({ dis[cy][cx + 1] ,{ cy,cx + 1 } });
			}
		}
		if (flag[cy][cx - 1]) {
			if (c + cost_y[cy] < dis[cy][cx - 1]) {
				dis[cy][cx - 1] = c + cost_y[cy];
				Q.push({ dis[cy][cx - 1] ,{ cy,cx - 1 } });
			}
		}
	}
	if (dis[y][x] == INT_MAX) {
		cout << "-1\n";
	}
	else {
		cout << dis[y][x] << endl;
	}
	return 0;
}