목록분류 전체보기 (217)
Study hard
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)에 도착하면 이동거리 반..
https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로�� www.acmicpc.net [풀이] 기존의 최단 경로를 구하는 bfs를 쓰지만, visited를 3차원 배열로 선언하여 그 좌표를 벽을 1번 부수고 방문했는지와 부수지 않고 방문했는지 여부를 표시해줬다. #include #include #include //scanf using namespace std; struct State { int x, y; int b_cnt, p_len;//벽을 부순 횟수..
https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크� www.acmicpc.net [풀이] 벽 3개를 새로 새우는 모든 경우의 수에 대해 바이러스가 확산되고 나서의 안전영역을 구하는 문제였다. 먼저 dfs로 이차원 배열의 조합을 구하면서 각 케이스마다 bfs를 이용하여 바이러스가 확산됐을 때의 빈칸의 개수를 구하면 된다. #include #include #include using namespace std; struct Pos { int x, y; }; int N, M; int Map[8]..
https://www.acmicpc.net/problem/9019 9019번: DSLR 네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 � www.acmicpc.net [풀이] A에서 B로 변환하기 위해 필요한 최소한의 명령어 나열을 출력하는 문제이므로 bfs를 사용했다. DSLR연산을 각각 한 상태를 queue에 집어넣고 B가 나오면 그때까지 사용했던 연산 문자열을 반환했다. #include #include #include //memset #include using namespace std; struct Value { int n; string ..
https://www.acmicpc.net/problem/16948 16948번: 데스 나이트 게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크 www.acmicpc.net [풀이] 최소 이동 횟수를 구하므로 bfs를 사용했다. 데스 나이트가 있는 칸에서 6방향을 모두 살펴보며 칸을 이동할 때마다 전 칸까지의 이동 횟수 + 1을 저장해둔다. #include #include #include //memset using namespace std; struct pos { int r, c; }; i..
https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으 www.acmicpc.net [풀이] 같은 알파벳이 적힌 칸을 두 번 지날 수 없다는 조건이 있으므로 새로운 알파벳을 지날 때마다 체크를 해주었다. 한 칸씩 움직일 때마다 최대 칸 수를 갱신한다. #include #include using namespace std; int R, C; char Board[20][20]; bool check[25];//ascii코드로 변환해서 체크 const int dx[] = { -1,..