#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; string a[n][m]; for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) cin >> a[i][j]; for(int o = 0; o < q; ++o) { int t, i1, j1, i2, j2; cin >> t >> i1 >> j1 >> i2 >> j2; int od[n+1][m+1]; for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) od[i][j] = INT_MAX; priority_queue <pair <int, pair <int, int>>> q; od[i1][j1] = t; q.push({-t, {i1, j1}}); while(q.size()) { int ti = q.top().second.first, tj = q.top().second.second; int tt = -q.top().first; q.pop(); //cout << ti << " " << tj << " " << tt << "\n"; if(ti == i2 && tj == j2) { cout << tt << "\n"; break; } if(ti-1 >= 0) { int mint1 = INT_MAX, mint2 = INT_MAX; if(tj-1 >= 0 && ti-1 < n && tj-1 < m) for(mint1 = tt; a[ti-1][tj-1][mint1%a[ti-1][tj-1].length()] == '1'; ++mint1) {} if(ti-1 < n && tj < m) for(mint2 = tt; a[ti-1][tj][mint2%a[ti-1][tj].length()] == '1'; ++mint2) {} if(min(mint1, mint2) < od[ti-1][tj]) { od[ti-1][tj] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti-1, tj}}); //cout << "1"; } } //cout << "a"; if(ti+1 <= n) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti < n && tj-1 >= 0 && tj-1 < m) for(mint1 = tt; a[ti][tj-1][mint1%a[ti][tj-1].length()] == '1'; ++mint1) {} if(ti < n && tj < m) for(mint2 = tt; a[ti][tj][mint2%a[ti][tj].length()] == '1'; ++mint2) {} if(min(mint1, mint2) < od[ti+1][tj]) { od[ti+1][tj] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti+1, tj}}); //cout << "2"; } } //cout << "b"; if(tj-1 >= 0) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti-1 >= 0 && ti-1 < n && tj-1 < m) for(mint1 = tt; a[ti-1][tj-1][mint1%a[ti-1][tj-1].length()] == '0'; ++mint1) {} if(ti < n && tj-1 < m) for(mint2 = tt; a[ti][tj-1][mint2%a[ti][tj-1].length()] == '0'; ++mint2) {} if(min(mint1, mint2) < od[ti][tj-1]) { od[ti][tj-1] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti, tj-1}}); //cout << "3"; } } //cout << "c"; if(tj+1 <= m) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti-1 >= 0 && tj < m) for(mint1 = tt; a[ti-1][tj][mint1%a[ti-1][tj].length()] == '0'; ++mint1) {} if(ti < n && tj < m) for(mint2 = tt; a[ti][tj][mint2%a[ti][tj].length()] == '0'; ++mint2) {} if(min(mint1, mint2) < od[ti][tj+1]) { od[ti][tj+1] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti, tj+1}}); //cout << "4"; } } //cout << "d"; //cout << "\n"; } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; string a[n][m]; for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) cin >> a[i][j]; for(int o = 0; o < q; ++o) { int t, i1, j1, i2, j2; cin >> t >> i1 >> j1 >> i2 >> j2; int od[n+1][m+1]; for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) od[i][j] = INT_MAX; priority_queue <pair <int, pair <int, int>>> q; od[i1][j1] = t; q.push({-t, {i1, j1}}); while(q.size()) { int ti = q.top().second.first, tj = q.top().second.second; int tt = -q.top().first; q.pop(); //cout << ti << " " << tj << " " << tt << "\n"; if(ti == i2 && tj == j2) { cout << tt << "\n"; break; } if(ti-1 >= 0) { int mint1 = INT_MAX, mint2 = INT_MAX; if(tj-1 >= 0 && ti-1 < n && tj-1 < m) for(mint1 = tt; a[ti-1][tj-1][mint1%a[ti-1][tj-1].length()] == '1'; ++mint1) {} if(ti-1 < n && tj < m) for(mint2 = tt; a[ti-1][tj][mint2%a[ti-1][tj].length()] == '1'; ++mint2) {} if(min(mint1, mint2) < od[ti-1][tj]) { od[ti-1][tj] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti-1, tj}}); //cout << "1"; } } //cout << "a"; if(ti+1 <= n) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti < n && tj-1 >= 0 && tj-1 < m) for(mint1 = tt; a[ti][tj-1][mint1%a[ti][tj-1].length()] == '1'; ++mint1) {} if(ti < n && tj < m) for(mint2 = tt; a[ti][tj][mint2%a[ti][tj].length()] == '1'; ++mint2) {} if(min(mint1, mint2) < od[ti+1][tj]) { od[ti+1][tj] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti+1, tj}}); //cout << "2"; } } //cout << "b"; if(tj-1 >= 0) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti-1 >= 0 && ti-1 < n && tj-1 < m) for(mint1 = tt; a[ti-1][tj-1][mint1%a[ti-1][tj-1].length()] == '0'; ++mint1) {} if(ti < n && tj-1 < m) for(mint2 = tt; a[ti][tj-1][mint2%a[ti][tj-1].length()] == '0'; ++mint2) {} if(min(mint1, mint2) < od[ti][tj-1]) { od[ti][tj-1] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti, tj-1}}); //cout << "3"; } } //cout << "c"; if(tj+1 <= m) { int mint1 = INT_MAX, mint2 = INT_MAX; if(ti-1 >= 0 && tj < m) for(mint1 = tt; a[ti-1][tj][mint1%a[ti-1][tj].length()] == '0'; ++mint1) {} if(ti < n && tj < m) for(mint2 = tt; a[ti][tj][mint2%a[ti][tj].length()] == '0'; ++mint2) {} if(min(mint1, mint2) < od[ti][tj+1]) { od[ti][tj+1] = min(mint1, mint2); q.push({-min(mint1, mint2), {ti, tj+1}}); //cout << "4"; } } //cout << "d"; //cout << "\n"; } } return 0; } |