코테/구현

[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;
}