2015. 1. 24. 13:17ㆍSecurity ★ Development/알고리즘
문제는 더블릿 14 queue(bfs)에 있는 horse_knight입니다.
문제 사이트 주소입니다.
http://183.106.113.109/30stair/horse_knight/horse_knight.php?pname=horse_knight
장기의 마와 체스의 나이트가 있고 이동할 수 있는 방향은 동일한데 마는 가는 길에 장애물이 있으면 갈 수 없습니다. 이때 출발지점부터 모든 칸에 대해 나이트가 마보다 빨리 갈 수 있는 칸의 수를 구하는 것입니다. 두 말 모두 갈 수 없으면 세지 않고 나이트만 갈 수 있는 곳은 나이트가 빨리 갔다고 간주합니다.
여기서는 모든 칸에 대해 라는 말이 있으므로 큐를 이용한 bfs를 씁니다. 각 위치와 각 위치별 이동 카운트를 가진 클래스 이용한 큐를 생성합니다. 그리고 첫번째 위치를 넣습니다. 판의 각 칸에 대해 먼저 나이트와 마가 그 칸까지 갈 때 필요한 카운트를 구합니다.
배열을 2개를 만들고 하나씩 구하면 됩니다.
먼저 나이트에 대해 이동할 수 있는 칸이 판의 범위를 벗어나지 않고 장애물이 없을 경우 그곳으로 이동하며 위치와 카운트를 넣은 클래스 객체(구조체)를 큐에 넣습니다. 그리고 판에도 카운트를 넣습니다. 이 과정을 나이트의 8방향에 대해 해주고 다음 while문을 돌 때 큐에서 하나 빼줘서 같은 과정을 거칩니다. 더 이상 갈 수 있는 방향이 없을 경우 큐에 값이 들어가지 않을 것이고, 큐는 텅 비게 되며 이때 while문을 벗어납니다.
마도 같은 과정을 거치는데 대신 장애물이 있을 경우의 조건을 더해서 이 때에는 갈 수 없다고 판단하므로 큐에 넣지 않습니다.
두 대상에 대해 모두 끝내면 판 배열에는 나이트와 마가 그 칸을 이동할 때 필요한 카운트가 들어가 잇습니다.
배열을 돌면서 나이트의 카운트가 마의 카운트보다 작은 경우, 나이트는 갈 수 있지만 마는 갈 수 없는 경우의 수를 세서 출력하면됩니다.
'Security ★ Development > 알고리즘' 카테고리의 다른 글
배열 3 matti_block (0) | 2015.01.29 |
---|---|
퀵 정렬, 이진검색, parametric search 1 aggressive (0) | 2015.01.27 |
배열 2 dwarf (0) | 2015.01.23 |
2012 지역 본선 고등 1/5 koi_aio (0) | 2015.01.18 |
2013 koi 초등 지역 본선 1/5 koi_bowl (0) | 2015.01.17 |