Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int INF = 2e9;
- using pi = pair <int, int>;
- using pii = pair < int, pi>;
- const int D = 2520;
- const int N = 110;
- int di1[] = {0, 0, 1, -1, 1, -1};
- int dj1[] = {1, -1, 0, 0, -1, -1};
- int di2[] = {0, 0, 1, -1, 1, -1};
- int dj2[] = {1, -1, 0, 0, 1, 1};
- bool visited[D][N][N];
- int ar[N][N];
- int n, m;
- bool check(int i, int j){
- return i >= 0 and j >=0 and i < n and j < m and ar[i][j] != 0;
- }
- int main(){
- scanf("%d%d", &n, &m);
- for(int i=0;i<n;i++){
- for(int j=0;j<m;j++){
- scanf("%d", &ar[i][j]);
- }
- }
- queue <pii> q;
- if(check((n-1)/2 - 1, 0))
- q.push({1, {(n-1)/2 - 1, 0}});
- if(check((n-1)/2, 0))
- q.push({1, {(n-1)/2, 0}});
- if(check((n-1)/2 + 1, 0))
- q.push({1, {(n-1)/2 + 1, 0}});
- int ei = (n-1)/2;
- int ej = m-1;
- while(q.size() > 0){
- int ui, uj, Dis;
- Dis = q.front().first;
- ui = q.front().second.first;
- uj = q.front().second.second;
- q.pop();
- if(ui == ei and uj == ej) {
- printf("%d", Dis);
- return 0;
- }
- if((ui + 1) % 2 == 0){
- for(int d=0;d<6;d++){
- int vi = ui + di1[d];
- int vj = uj + dj1[d];
- if(check(vi, vj) and !visited[(Dis + 1) % D][vi][vj] and (Dis + 1) % ar[vi][vj] == 0){
- visited[(Dis + 1) % D][vi][vj] = true;
- q.push({Dis + 1, {vi, vj}});
- }
- }
- }
- else {
- for(int d=0;d<6;d++){
- int vi = ui + di2[d];
- int vj = uj + dj2[d];
- if(check(vi, vj) and !visited[(Dis + 1) % D][vi][vj] and (Dis + 1) % ar[vi][vj] == 0){
- visited[(Dis + 1) % D][vi][vj] = true;
- q.push({Dis + 1, {vi, vj}});
- }
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement