Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- using namespace std;
- //#define int long long
- int k[101][101], k1[101][101];
- int rx[4] = {1, -1, 0, 0};
- int ry[4] = {0, 0, 1, -1};
- signed main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- int n, m, h;
- cin >> n >> m >> h;
- string s[n];
- for (int i = 0; i < n; ++i) {
- cin >> s[i];
- }
- int x[n][m];
- int sx = -1, sy = -1, fx = -1, fy = -1;
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < m; ++j) {
- cin >> x[i][j];
- if (s[i][j] == 'A') {
- sx = i;
- sy = j;
- } else if (s[i][j] == 'B') {
- fx = i;
- fy = j;
- }
- }
- queue < pair < int , int > > q;
- q.push({sx, sy});
- int hp[n][m] = {};
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < m; ++j) {
- hp[i][j] = -1;
- }
- hp[sx][sy] = h;
- k[sx][sy] = 1;
- while (!q.empty()) {
- int vx = q.front().F, vy = q.front().S;
- q.pop();
- for (int i = 0; i < 4; ++i) {
- int st = 0;
- int a = vx + rx[i], b = vy + ry[i];
- if (a < 0 || b < 0 || a >= n || b >= m || s[a][b] == 'X') {
- continue;
- }
- if (s[a][b] == 'I') {
- st = x[a][b];
- }
- else if(s[a][b] == 'F')st = -x[a][b];
- // cout << vx << " " << vy << " " << a << " " << b << " " << hp[a][b] << " " << hp[vx][vy] << endl;
- if (hp[vx][vy] - st > 0) {
- if ((k[vx][vy] + 1 < k[a][b] && k[a][b] != 0)|| (k[vx][vy] + 1 == k[a][b] && k[vx][vy] + 1 > hp[a][b] && k[a][b] != 0) || k[a][b] == 0){
- q.push({a, b});
- k[a][b] = k[vx][vy] + 1;
- hp[a][b] = hp[vx][vy] - st;
- hp[a][b] = min(h, hp[a][b]);
- }
- }
- else if (s[vx][vy] =='F'){
- if (st > h)continue;
- if ((k[vx][vy] + (st - hp[vx][vy] + 1) < k[a][b] && k[a][b] != 0)|| (k[vx][vy] + (st - hp[vx][vy] + 1) == k[a][b] && k[vx][vy] + (st - hp[vx][vy] + 1) > hp[a][b] && k[a][b] != 0) || k[a][b] == 0){
- q.push({a, b});
- k[a][b] = k[vx][vy] + (st - hp[vx][vy] + 1);
- hp[a][b] = 1;
- hp[a][b] = min(h, hp[a][b]);
- }
- }
- }
- // cout << q.size() << endl;
- }
- cout << k[fx][fy] - 1 << endl;
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < m; ++j) {
- hp[i][j] = -1;
- }
- hp[sx][sy] = h;
- q.push({sx, sy});
- k1[sx][sy] = 1;
- while (!q.empty()) {
- int vx = q.front().F, vy = q.front().S;
- q.pop();
- for (int i = 0; i < 4; ++i) {
- int st = 0;
- int a = vx + rx[i], b = vy + ry[i];
- if (a < 0 || b < 0 || a >= n || b >= m || s[a][b] == 'X') {
- continue;
- }
- if (s[a][b] == 'F') {
- st = x[a][b];
- }
- else if (s[a][b] == 'I')st = -x[a][b];
- // cout << vx << " " << vy << " " << a << " " << b << " " << hp[a][b] << " " << hp[vx][vy] << endl;
- if (hp[vx][vy] - st > 0) {
- if ((k1[vx][vy] + 1 < k1[a][b] && k1[a][b] != 0)|| (k1[vx][vy] + 1 == k1[a][b] && k1[vx][vy] + 1 > hp[a][b] && k1[a][b] != 0) || k1[a][b] == 0){
- q.push({a, b});
- k1[a][b] = k1[vx][vy] + 1;
- hp[a][b] = hp[vx][vy] - st;
- hp[a][b] = min(h, hp[a][b]);
- }
- }
- else if (s[vx][vy] =='I'){
- if (st > h)continue;
- if ((k1[vx][vy] + (st - hp[vx][vy] + 1) < k1[a][b] && k1[a][b] != 0) || k1[a][b] == 0){
- q.push({a, b});
- k1[a][b] = k1[vx][vy] + (st - hp[vx][vy] + 1);
- cout << (st - hp[vx][vy] + 1) << " " << st << " " << hp[vx][vy] << endl;
- hp[a][b] = 1;
- hp[a][b] = min(h, hp[a][b]);
- }
- }
- }
- }
- // cout << k1[fx][fy];
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < m; ++j) {
- cout << k1[i][j] << " ";
- }
- cout << endl;
- }
- cout << sx << " " << sy << " " << fx << " " << fy;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement