<링크>
https://www.acmicpc.net/problem/3190
<풀이>
-body배열 : body[i][j] = 좌표(i,j)가 내 몸이면 1, 아니면 0
//초기에는 사과의 위치로도 쓰인다.
-comm배열 : comm[i]=j일 때, j는 i초때 전환하는 방향이다.
-toDir배열 : toDir[i][j] = 꼬리가 좌표(i,j)에 있을 때 이동해야한다면 어느방향으로 가야하는가
0. 머리좌표랑 꼬리좌표 다 (1,1)로 초기화 , body[1][1]=1 체크
1. toDir의 머리좌표에 어느방향으로 떠나는지 기록해놓는다. 나중에 해당좌표에서 꼬리를 옮길 때 머리가 떠난 방향 그대로 옮겨야 하기 때문.
2. 방향 대로 머리를 옮기고 시간을 증가시켜준다.
3. 머리가 간 곳이 벽이거나, body배열을 체크했을 때 해당 좌표가 1이면 상태면 프로그램끝.
4. 머리 좌표에 사과가 없으면 body의 꼬리좌표를 0으로 만들어주고, 꼬리를 옮긴다. 옮길 때 아까 적어두었던 toDir배열 참조해서 그 방향 그대로 옮긴다.
5. body배열의 머리 좌표를 1로 갱신
6. 현재 시간에 방향 전환명령이 있으면 방향 갱신
1~6을 반복하면 된다.
<소스코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<stdio.h> int toDir[101][101]; //나중에 꼬리가 옮겨야할 방향기록 int body[101][101]; //몸이 어느곳을 차지하고있는지 int toI[4] = { 0,-1,0,1 }; //좌상우하 int toJ[4] = { -1,0,1,0 }; char comm[100000]; int main() { int N, K, L; scanf("%d%d", &N, &K); int a, b; while (K--) { scanf("%d%d", &a, &b); body[a][b] = 2; } scanf("%d", &L); while (L--) { char c; scanf("%d%c%c", &a, &c, &c); comm[a] = c; } int sec = 0; int hi, hj, ti, tj; hi = hj = ti = tj = 1; body[hi][hj] = 1; int dir = 2; while (1) { ++sec; toDir[hi][hj] = dir; hi += toI[dir]; hj += toJ[dir]; if (hi == 0 || hi == N + 1 || hj == 0 || hj == N + 1 || body[hi][hj] == 1) break; if (body[hi][hj] != 2) //사과 없으면 { body[ti][tj] = 0; int d = toDir[ti][tj]; ti += toI[d]; tj += toJ[d]; } body[hi][hj] = 1; if (comm[sec] != 0) { if (comm[sec] == 'L') { if (dir == 0) dir = 3; else dir -= 1; } else dir = (dir + 1) % 4; } } printf("%d", sec); } | cs |
'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글
백준 15685 드래곤커브 (0) | 2018.09.30 |
---|---|
백준 14890 경사로 :: 들짐승 (0) | 2018.07.22 |
백준 14499 주사위굴리기 :: 들짐승 (0) | 2018.07.22 |
백준 12100 2048(Easy) :: 들짐승 (0) | 2018.07.22 |