알고리즘 풀이/BFS(너비 우선 탐색)
BOJ 1726 [로봇]
갓우태
2018. 10. 4. 06:20
BOJ 로봇 : https://www.acmicpc.net/problem/1726
이번 문제는 백준 온라인 저지의 [로봇] 입니다.
재방문을 방지하기위해 Visited를 사용했습니다만,
3차원으로 방향에 대한 방문도 고려하도록 했습니다.
로봇이 할 수 있는 행동인 1~3칸 앞으로 가기, 방향 꺾기 등을 큐에 담으며 탐색을 진행합니다.
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 | #include <iostream> #include <queue> using namespace std; int M, N; int Map[100][100]; bool Visited[100][100][4]; //방향까지 봄 int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; class Node { public: int i, j, dir, depth; Node() {} Node(int i, int j, int dir, int depth) : i(i), j(j), dir(dir), depth(depth) {} }; queue<Node> q; Node goal; bool is_bound(int i, int j) { return i >= 0 && i < M && j >= 0 && j < N; } int BFS() { int result = 0; while(!q.empty()) { Node node = q.front(); q.pop(); int i = node.i; int j = node.j; int dir = node.dir; int depth = node.depth; if(i == goal.i && j == goal.j && dir == goal.dir) { return depth; } bool is_block = false; for(int k = 1; k <= 3; k++) { //일직선으로 가기 먼저 int next_i = i + d[dir][0] * k; int next_j = j + d[dir][1] * k; if(is_bound(next_i, next_j)) { if(!Map[next_i][next_j] && !Visited[next_i][next_j][dir]) { Visited[next_i][next_j][dir] = true; Node new_node(next_i, next_j, dir, depth + 1); q.push(new_node); } else if(Map[next_i][next_j]){ is_block = true; } } if(is_block) break; } //회전 하기 int next_dir_1, next_dir_2; if(dir == 0 || dir == 1) { next_dir_1 = 2; next_dir_2 = 3; } else { next_dir_1 = 0; next_dir_2 = 1; } if(!Visited[i][j][next_dir_1]) { Visited[i][j][next_dir_1] = true; Node new_node(i, j, next_dir_1, depth+1); q.push(new_node); } if(!Visited[i][j][next_dir_2]) { Visited[i][j][next_dir_2] = true; Node new_node(i, j, next_dir_2, depth+1); q.push(new_node); } } return result; } int main() { cin >> M >> N; for(int i = 0; i < M; i++) for(int j = 0; j < N; j++) cin >> Map[i][j]; int i, j, dir; cin >> i >> j >> dir; Node first_node(i-1, j-1, dir-1, 0); Visited[i-1][j-1][dir-1] = true; q.push(first_node); cin >> i >> j >> dir; goal.i = i-1; goal.j = j-1; goal.dir = dir-1; cout << BFS() << endl; return 0; } | cs |
반응형