본문 바로가기

BFS

(19)
13265색칠하기 acmicpc.net/problem/13265 이분그래프 문제같다. 나는 dfs가 좋다. dfs를 진행하면서, 색을 계속 바꿔가며 (not c)칠한다. 만일 이미 색칠되어있는 칸을 만났는데, 현재색과 같으면 불가능한것이므로 바로 종료한다 아니면 계속dfs를 진행한다 이전에 이분그래프문제를 풀어봤더니 쉽게 풀었다. import sys from collections import deque input = sys.stdin.readline def bfs(i): q = deque() q.append((i, True)) while q: now, c = q.popleft() for next in arr[now]: if visited[next] == c: return False elif visited[next] == ..
13460구슬탈출2 https://www.acmicpc.net/problem/13460 13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' www.acmicpc.net 빡세다. 예외케이스가 너무 많다. 말로는 쉽다 빨간구슬과 파랑구슬의 x,y좌표와 시간을 각각 큐에 넣고, 더이상 진행할 수 없을때까지 한방향으로 움직인다음, 조건에따라종료하면 된다. 근데 빡세다. 코드에 주석을 주렁주렁 달아놨더니 설명은 그만하겠다. import sys from collections import deque input=sys.stdi..
18405경쟁적 전염 https://www.acmicpc.net/problem/18405 18405번: 경쟁적 전염 첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치 www.acmicpc.net ㅋㅋㅋㅋㅋㅋㅋ 정신똑바로차리고풀어야겠다 말도안되는부분에서실수했다. 그냥 bfs다 큐에 넣을때 바이러스 내림차순으로만 넣어주면된다. 끝 import sys from collections import deque input=sys.stdin.readline arr=[] move=[[-1,0],[1,0],[0,-1],[0,1]] n,k=map(int,input().split..
16197 두동전 https://www.acmicpc.net/problem/16197 16197번: 두 동전 N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, www.acmicpc.net bfs를 두 동전으로 하면 된다 방문처리를 안하고도 풀 수있지만, 시간이 어마어마하계 걸린다. 나는 따로 방문배열을 만든 것이 아니라, set에 각 동전에 위치를 넣고, 비교하는 방식으로 했다. 60%에서 계속 에러가 나서 고민했는데, 최대10번까지 허용인데 11번까지 허용해서 그랬다. 즉, 11번하면 정답인 경우에는 -1을 출력해야한다. 더러운문제였다. 코드 from collections im..
6087레이저통신 https://www.acmicpc.net/problem/6087 6087번: 레이저 통신 크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 www.acmicpc.net 처음엔, 모든 방향으로 더이상갈수없을때까지 bfs를 반복하다보면 답이 나올거라 생각했다. 근데 50%정도에서 계속 틀려서 반례를보니깐 4 4 C... .... **.. **.C 다음과같은반례가 있었다. 요점은, 한 지점에 도착하는 최소경로가, 방향에 따라 최적의 정답이 아닐 수 있다는 것이다. 따라서, 만일 bfs를 진행하다가, 다음 방문점이 지금의 방문점보다 클때만 탐색을 진행하고, 만..
16954 움직이는 미로 탈출 https://www.acmicpc.net/problem/16954 16954번: 움직이는 미로 탈출 욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽 www.acmicpc.net 처음에는 그래프를 통한 bfs를 생각했지만, 배열도 만들지 않고 풀었다. 아이디어만 알면 진짜 간단하다. 먼져, 벽의 위치를 집합에 넣는다. 이후 7번 (어느 벽이던 7번 턴이 지나면 사라지므로) 반복문을 돌며 bfs를 하는데, 다음 노드를 큐에 끝에 넣지 않고 임시집합에 넣는다. 그후, 벽을 아래로 한칸식 이동시킨 후에, 임시집합에서 벽을 빼주어 안겹치는 노드를 구한 후, 다시반복문을..
14466소가길을건너간이유6 https://www.acmicpc.net/problem/14466 14466번: 소가 길을 건너간 이유 6 첫 줄에 N, K, R이 주어진다. 다음 R줄에는 한 줄에 하나씩 길이 주어진다. 길은 상하좌우로 인접한 두 목초지를 잇고, r c r′ c′의 형태 (행, 열, 행, 열)로 주어진다. 각 수는 1 이상 N 이하이다. www.acmicpc.net 처음엔 단순히 모든 소에 대해 bfs를 실행하여, 만나지못하는 모든 소를 구하고, 만난소+1(자신) 에다가 만나지못한 모든소를 곱해준다음, 쌍이니 2로 나눠주는식으로 구했다. 이렇게 통과를 하긴 했는데, 다른사람들정답을 보니 전부나보다 빨랐다. (1048ms나옴) 약속이 있어서 나갔다가 생각났는데, arr에 대하여 bfs로 구역을 나누고, 배열에 구역별 ..
2206 벽부수고 이동하기 https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 가장 기본적인 방식 visited 2차원배열에, 한차원을 더 추가하여 벽을 부쉈는지를 판별한다. 만일 벽을 부쉈다면, 앞으로 벽을 부수지 못할 것이고, 벽을 부수지 않았다면, 벽을 부순 대신 벽을 부순 차원으로 넘어간다. 이렇게 가장 먼저 n-1,m-1에 도착한 요소를 찾아 +1 해주고 print(해주면된다.) 2차원까지는 머리가 돌아가는데, 3차원부터는 상당히 어지럽다...