ソースコード
#include "iostream"
#include "climits"
#include "list"
#include "queue"
#include "stack"
#include "set"
#include "functional"
#include "algorithm"
#include "math.h"
#include "utility"
#include "string"
#include "map"
#include "unordered_map"
#include "iomanip"
#include "random"
using namespace std;
const int N = 20;
int main() {
//std::random_device rnd; // 乱数生成機
//std::mt19937 mt(rnd());
//FILE *ifile[N];
//FILE *ofile[N];
//
//for (int i = 0; i < N; i++) {
// char s[100] = {};
// char t[100] = {};
// sprintf(s, "input/%d.txt", i + 1);
// ifile[i] = fopen(s, "w");
// sprintf(t, "output/%d.txt", i + 1);
// ofile[i] = fopen(t, "w");
//}
// for (int i = 0; i < N; i++) {
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;
// cout << cy << " " << cx << " " << c << endl;
if (cy == y&&cx == x)break;
if (flag[cy + 1][cx]) {
if (c + cost_x[cx] < dis[cy + 1][cx])Q.push({ c + cost_x[cx] ,{cy + 1,cx} });
}
if (flag[cy - 1][cx]) {
if (c + cost_x[cx] < dis[cy - 1][cx])Q.push({ c + cost_x[cx] ,{ cy - 1,cx } });
}
if (flag[cy][cx + 1]) {
if (c + cost_y[cy] < dis[cy][cx + 1])Q.push({ c + cost_y[cy] ,{ cy,cx + 1 } });
}
if (flag[cy][cx - 1]) {
if (c + cost_y[cy] < dis[cy][cx - 1])Q.push({ c + cost_y[cy] ,{ cy,cx - 1 } });
}
}
if (dis[y][x] == INT_MAX)cout << "-1\n";
else cout << dis[y][x] << endl;
// }
return 0;
}