Advertisement
K_Y_M_bl_C

Untitled

Jan 14th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. struct pos
  2. {
  3.     int x, y, dir, x1, y1, dir1;
  4.     pos() { x = 0, y = 0, dir = 0, x1 = 0, y1 = 0, dir1 = 0; };
  5.     pos(int x, int y, int dir, int x1, int y1, int dir1) : x(x), y(y), dir(dir), x1(x1), y1(y1), dir1(dir1) {};
  6. };
  7.  
  8. char c;
  9. int n;
  10. int dp[21][21][4][21][21][4];
  11. int a[21][21];
  12. int dx[4] = { -1, 0, 1, 0 };
  13. int dy[4] = { 0, 1, 0, -1 };
  14.  
  15. // U R D L
  16. // 0 1 2 3
  17.  
  18.  
  19. int bfs()
  20. {
  21.     dp[n - 1][0][0][n - 1][0][1] = 1;
  22.     pos st = pos(n - 1, 0, 0, n - 1, 0, 1);
  23.     queue <pos> q;
  24.     q.push(st);
  25.     while (!q.empty())
  26.     {
  27.         pos cr = q.front();
  28.         int x = cr.x;
  29.         int y = cr.y;
  30.         int dir = cr.dir;
  31.         int x1 = cr.x1;
  32.         int y1 = cr.y1;
  33.         int dir1 = cr.dir1;
  34.         q.pop();
  35.         //FORWARD
  36.         {
  37.             int nx = min(n - 1, max(0, x + dx[dir]));
  38.             int ny = min(n - 1, max(0, y + dy[dir]));
  39.             int nx1 = min(n - 1, max(0, x1 + dx[dir1]));
  40.             int ny1 = min(n - 1, max(0, y1 + dy[dir1]));
  41.             if (!a[nx][ny])
  42.                 nx = x, ny = y;
  43.             if (!a[nx1][ny1])
  44.                 nx1 = x1, ny1 = y1;
  45.             pos cur = pos(nx, ny, dir, nx1, ny1, dir1);
  46.             if (!dp[nx][ny][dir][nx1][ny1][dir1])
  47.             {
  48.                 dp[nx][ny][dir][nx1][ny1][dir1] = dp[x][y][dir][x1][y1][dir1] + 1;
  49.                 q.push(cur);
  50.                 if (nx == 0 && ny == n - 1 && nx1 == 0 && ny1 == n - 1)
  51.                     return dp[nx][ny][dir][nx1][ny1][dir1] - 1;
  52.             }
  53.         }
  54.         //TURN LEFT
  55.         {
  56.             int ndir = (dir + 3) % 4;
  57.             int ndir1 = (dir1 + 3) % 4;
  58.             pos cur = pos(x, y, ndir, x1, y1, ndir1);
  59.             if (!dp[x][y][ndir][x1][y1][ndir1])
  60.             {
  61.                 dp[x][y][ndir][x1][y1][ndir1] = dp[x][y][dir][x1][y1][dir1] + 1;
  62.                 q.push(cur);
  63.             }
  64.         }
  65.         //TURN RIGHT
  66.         {
  67.             int ndir = (dir + 1) % 4;
  68.             int ndir1 = (dir1 + 1) % 4;
  69.             pos cur = pos(x, y, ndir, x1, y1, ndir1);
  70.             if (!dp[x][y][ndir][x1][y1][ndir1])
  71.             {
  72.                 dp[x][y][ndir][x1][y1][ndir1] = dp[x][y][dir][x1][y1][dir1] + 1;
  73.                 q.push(cur);
  74.             }
  75.         }
  76.     }
  77.     return -1;
  78. }
  79.  
  80. int solve()
  81. {
  82.     cin >> n;
  83.     for (int i = 0; i < n; ++i)
  84.         for (int j = 0; j < n; ++j)
  85.             cin >> c, a[i][j] = (c == 'E');
  86.     int ans = bfs();
  87.     printf("%d", ans);
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement