2016년 9월 28일 수요일

BOJ 1347 미로 만들기

주인공이 미로이 어느 한 칸에 남쪽을 향한 상태로 서있고, 그 상태에서 시작해서 R, L은 각각 그 자리에서 방향만 오른쪽, 왼쪽으로 90도 도는 것이며 F는 앞으로 이동하는 것인다.
주인공이 어느 한 칸에서 남쪽을 향해 서있던 상태에서 시작해서 이동할 수 있는 모든 칸으로 이동한 자신의 움직임을 기록해놓은 정보가 입력으로 주어진다. 그러면 그 정보를 보고 미로를 그려서 출력해야 한다. 이동한 칸은 . 으로, 이동하지 않은 칸은 벽이므로 #으로 출력하면 된다. 그리고 미로는 직사각형 격자 모양이고, 주인공은 이동할 수 있는 칸은 모두 방문하므로 주인공이 이동한 칸을 .으로 설정하고 나머지 칸은 모두 다 #으로 설정한 후 출력하면 될 것 같다.
문제 분류를 보니 시뮬레이션이라고 되어있다.

dr [] = {1, 0, -1, 0}; //행
dc[] = {0, -1, 0, 1}; //열
       하, 좌, 상, 우

dr[0]=하, dr[1]=좌, dr[2]=상, dr[3]=우

처음에는 남쪽을 보고 있으니 방향을 뜻하는 숫자를 1을 가지고 있는다. 그리고 R이 나오면(방향+1)%4를 해주면 되고, L이 나오면 방향==0일때는 3, 0이 아닐때는 방향-1을 해주면 된다. 그리고 F일 때는 그 방향대로 한 칸 이동한다.
움직이으로 주어지는 문자열의 길이는 50보다 작으므로 F만 계속 있다고 하더라도 최대 49칸이 이동한다. 49+49+1을 행, 열의 길이로 잡고 어디에서 시작할지 모르니까 중앙에서 시작한다. arr[99][99]행렬을 잡고, arr[49][49]에서 시작한다.
이렇게 해서 다 표시를 한 후에는 어떻게 미로의 크기를 알 수 있을까? 바로 문제의 조건에 모든 행과 열에는 이동할 수 있는 칸이 있다고 되어있어서 이동한 표시가 되어있는 칸을 보고 미로의 시작과 끝, 크기를 알 수 있을 것이다.

구현해 봐야겠다.
 F가 나오면 움직이기 때문에 움직일 때마다 행, 열의 최소, 최대 범위를 기록하는 변수와 비교해서 행, 열의 최소, 최대 범위를 갱신 해줬다.
그리고 출력할 때 행, 열의 최소, 최대 범위에서 출력해주면 된다.
AC를 받았다.





댓글 없음:

댓글 쓰기