목록백준/bfs, dfs (47)
Study hard
https://www.acmicpc.net/problem/1963 1963번: 소수 경로 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금 www.acmicpc.net [풀이] 소수는 에라토스테네스의 체 알고리즘을 이용하여 구하였다. 에라토스테네스의 체 알고리즘은 2부터 구하고자 하는 범위의 수들을 배열에 넣어 소수가 아닌 수를 체크하는 알고리즘이다. 2를 제외한 2로 나누어 떨어지는 값 체크 → 3을 제외한 3으로 나누어 떨어지는 값 체크 → (4는 이미 체크 되었으므로 패스) → 5를 제외한 5로 나누어 떨어지는 값 체크 → ··· 마지막까지 체크되지 않은 값들이 소..
https://www.acmicpc.net/problem/6087 6087번: 레이저 통신 크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 www.acmicpc.net [풀이] ※주의 할 것: 최소 거리를 구하는 게 아니라 거울 개수의 최솟값을 구하는 것! - bfs 사용 - visited 2차원 배열에 각 좌표까지 가는 데 놓아야 하는 거울 개수의 최솟값을 저장한다. #include #include #include using namespace std; struct Mirror { int x, y;//설치된 거울 좌표 int d;//방향 int mirr..
https://www.acmicpc.net/problem/3055 3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제�� www.acmicpc.net [풀이] bfs사용 물을 인접한 칸에 먼저 이동시킨 후에 고슴도치를 움직인다. #include #include #include using namespace std; struct State { int x, y; int cnt;//이동 시간 }; struct Water { int x, y; }; int R, C; char Forest[50][50]; bool visited[50][50]; const int d..
https://www.acmicpc.net/problem/16954 16954번: 움직이는 미로 탈출 욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽 www.acmicpc.net [풀이] bfs를 사용하였다. check배열을 3차원으로 선언하고 초 단위로 해당 좌표에 방문한 적 있는지 표시 (check[n][x][y] == n초에 (x,y)좌표에 방문한 적 있는지) 욱제의 캐릭터가 (0,7)에 도달할 수 있는 조건 1. 맨 윗칸 어디든 도착할 수 있으면 (0,7)에도 도착할 수 있다. 더 이상 위에서 내려올 벽이 없기 때문! 2. 8초가 지난 후엔 남아 있는 벽..
https://www.acmicpc.net/problem/16933 16933번: 벽 부수고 이동하기 3 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net [풀이] 1.최단 거리를 구하는 문제이므로 bfs사용 2.queue에 x좌표, y좌표, 벽을 부순 횟수(b_cnt), 이동거리(p_len), 낮밤여부(day) 저장 3.visited를 3차원 배열로 선언 (visited[x][y][b] == 좌표(x,y)에 b번 벽을 부수고 방문한 적 있는지) 4.한 번 이동할 때마다 queue에 -day저장하여 낮과 밤 바뀌게..
https://www.acmicpc.net/problem/14442 14442번: 벽 부수고 이동하기 2 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net [풀이] 1.최단 거리 구하는 문제이므로 bfs 사용 2.queue에 x좌표, y좌표, 벽을 부순 횟수, 이동거리 저장 3.벽을 만나면 무시하는 게 아니라 K번 이하로 벽을 부술 수 있으므로 visited를 3차원 행렬로 선언 4.벽을 n번 부수고 (x,y)좌표에 방문했으면 visited[x][y][n] = true 5.(N-1, M-1)에 도착하면 이동거리 반..