코테/구현
[C/C++] 나동빈 게임 개발, 구현
상똥
2023. 2. 15. 23:06
문제
크기가 세로 N 가로 M인 지도가 있다. 캐릭터가 현재 바라보는 방향에서 왼쪽부터 차례로 갈 곳을 정한다. 육지면 이동할 수 있고 바다면 이동할 수 없다. 이동할 수 없을 경우 왼쪽 방향으로 90도 돌아 다시 왼쪽부터 이동할 수 있는지 확인한다. 사방이 막혀있는 경우, 바라보는 방향 그대로 한 칸 뒤가 이미 이동한 칸이라면 다시 돌아간다. 그렇지 않으면 이동을 중단한다. 입력시 0=육지, 1=바다이며 캐릭터가 바라보는 방향은 0=북쪽, 1=동쪽, 2=남쪽, 3=서쪽이다. N과 M은 3과 50 사이이다. |
코드
#include <iostream>
using namespace std;
int map[50][50];
int hr[] = { 0,-1,0,1 };
int hc[] = { -1,0,1,0 };
int br[] = { 1,0,-1,0 };
int bc[] = { 0,-1,0,1 };
int main() {
int N, M, row, col, h;
scanf_s("%d %d", &N, &M);
scanf_s("%d %d %d", &row, &col, &h);
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++) {
cin >> map[i][j];
map[i][j]++;
}
/* 입력과 동시에 1씩 증가시키는 이유는, 값이
0인 곳으로 이동할 수 있도록 설정하면 행이나
열이 -값인 곳으로 벗어날 수 있기 때문이다.
결국 바다는 2, 이동할 수 있는 곳은 1이 된다.*/
map[row][col] = 3; //방문 표시
int check = 0, cnt = 1;
while (check < 5) {
if (check == 4) { //사방이 바다이거나 이미 방문한 곳일 때
if (map[row + br[h]][col + bc[h]] == 3) { //뒤로 한 칸 갈 수 있다면
row += br[h]; //뒤로 한 칸 이동
col += bc[h]; //뒤로 한 칸 이동
check = 0; //check값 초기화
}
else //뒤로 갈 수 없다면 종료
break;
}
if (map[row + hr[h]][col + hc[h]] == 1) { //이동할 수 있는 곳이라면
row += hr[h]; //왼쪽으로 이동
col += hc[h]; //왼쪽으로 이동
map[row][col] = 3; //방문 표시
check = 0; //check초기화
cnt++; //방문한 위치 수 증가
}
else
check++;
h += 3; //방향 조정
h %= 4; //방향 조정
}
cout << cnt << endl;
}