Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // http://www.usaco.org/index.php?page=viewproblem2&cpid=695
- #include <bits/stdc++.h>
- #include <bits/extc++.h>
- #define PROBLEM_NAME "cownav"
- using namespace std;
- #define FOR(i, l, r) for (int i = l; i < r; ++i)
- const int stepI[4] = {1, 0, -1, 0};
- const int stepJ[4] = {0, 1, 0, -1};
- int N;
- bool grid[20][20];
- bool vis[20][20][20][20][4] = {false};
- void move(int &i, int &j, int &r) {
- if (i == N-1 && j == N-1) return;
- int ii = i + stepI[r];
- int jj = j + stepJ[r];
- if (ii >= 0 && jj >= 0 && ii < N && jj < N && !grid[ii][jj]) {
- i = ii, j = jj;
- }
- }
- int main() {
- ios_base::sync_with_stdio(false); cin.tie(nullptr);
- freopen(PROBLEM_NAME ".in", "r", stdin); freopen(PROBLEM_NAME ".out", "w", stdout);
- cin >> N;
- FOR(i, 0, N) FOR(j, 0, N) {
- char c;
- cin >> c;
- grid[i][j] = c == 'H';
- }
- queue<tuple<int, int, int, int, int, int>> Q;
- Q.emplace(0, 0, 0, 0, 0, 0);
- vis[0][0][0][0][0] = true;
- int i, j, ii, jj, r, s;
- while (!Q.empty()) {
- tie(i, j, ii, jj, r, s) = Q.front();
- if (i == N-1 && j == N-1 && ii == N-1 && jj == N-1) {
- cout << s << endl;
- return 0;
- }
- Q.pop();
- if (!vis[i][j][ii][jj][(r+1)%4]) {
- vis[i][j][ii][jj][(r+1)%4] = true;
- Q.emplace(i, j, ii, jj, (r+1)%4, s+1);
- }
- if (!vis[i][j][ii][jj][(r+3)%4]) {
- vis[i][j][ii][jj][(r+3)%4] = true;
- Q.emplace(i, j, ii, jj, (r+3)%4, s+1);
- }
- move(i, j, r);
- move(ii, jj, (r+1)%4);
- if (!vis[i][j][ii][jj][r]) {
- vis[i][j][ii][jj][r] = true;
- Q.emplace(i, j, ii, jj, r, s+1);
- }
- }
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement