1. 현재의 방향에 대해서 갈 수 있는 것 넣기 2. 현재의 4방향에 대해서 돌리기 이렇게 2가지로 구분해서 하면 됩니다. 큐에 넣어도 됩니다. 많이 많이. 완전탐색을 하면 됩니다. 방향과 시간을 가지고 있으면 됩니다. break 문을 잘 사용하도록 합니다. 처음에 안되면 바로 탈출합니다. continue 가 아닌 break! |
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | /* 명령과 명령 2가 있습니다. 이에 대해 기능을 따로 추가해줍니다. */ #include <iostream> #include <queue> using namespace std; #define SIZE 101 // 101; #define qSIZE 130 // 130; int map[SIZE][SIZE]; int visit[SIZE][SIZE][5]; int x, y, nx, ny; struct point { int x, y, dir, cnt; }que[qSIZE * qSIZE]; int rear, front; int ans; int M, N; int dx[] = { 0,0,0,1,-1 }; int dy[] = { 0,1,-1,0,0 }; int startX, startY, endX, endY, startDir, endDir; int dir, cnt; void problemIn() { cin >> M >> N; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { cin >> map[i][j]; } } cin >> startX >> startY >> startDir; cin >> endX >> endY >> endDir; startX -= 1; startY -= 1; endX -= 1; endY -= 1; } void bfs() { while (rear != front) { front++; x = que[front].x; y = que[front].y; cnt = que[front].cnt; dir = que[front].dir; if (x == endX && y == endY && dir == endDir) { ans = cnt; return; } // 방향은 정해져 있음 for (int i = 1; i <= 3; i++) { nx = x + dx[dir] * i; ny = y + dy[dir] * i; if (nx < 0 || ny < 0 || nx >= M || ny >= N) break; if (map[nx][ny] == 1) break; if (visit[nx][ny][dir] == 0) { visit[nx][ny][dir] = 1; rear++; que[rear].x = nx; que[rear].y = ny; que[rear].dir = dir; que[rear].cnt = cnt + 1; } } // 현재 들은 것의 다른 방향에 대해서도 que 에 넣겠음 for (int i = 1; i < 5; i++) { if (visit[x][y][i] == 0) { visit[x][y][i] = 1; rear++; que[rear].x = x; que[rear].y = y; que[rear].dir = i; if (dir == 1) { if (i == 2) que[rear].cnt = cnt + 2; else que[rear].cnt = cnt + 1; } else if (dir == 2) { if (i == 1) que[rear].cnt = cnt + 2; else que[rear].cnt = cnt + 1; } else if (dir == 3) { if (i == 4) que[rear].cnt = cnt + 2; else que[rear].cnt = cnt + 1; } else if (dir == 4) { if (i == 3) que[rear].cnt = cnt + 2; else que[rear].cnt = cnt + 1; } } } } } void solve() { front = rear = -1; rear++; que[rear].x = startX; que[rear].y = startY; que[rear].dir = startDir; que[rear].cnt = 0; visit[startX][startY][startDir] = 1; bfs(); } int main() { problemIn(); solve(); cout << ans << endl; return 0; } | cs |