티스토리 뷰

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따

www.acmicpc.net

#include<iostream>
#include<vector>
#include<queue>
#include<utility>
#include<map>

using namespace std;

vector<vector<int>> sMap;

int direct[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };	//동, 남, 서, 북 ***
int N, K, L, result = 0;	//맵크기, 사과갯수, 명령갯수, 결과

int main(void) {
	//N*N map을 모두 0으로 초기화
	cin >> N;
	for (int i = 0; i < N; i++) {
		vector<int> temp;
		for (int j = 0; j < N; j++)
			temp.push_back(0);
		sMap.push_back(temp);
	}

	//사과의 위치 초기화	(map상에 4로 초기화 사과의 4 ㅋㅋㅋㅋ)
	cin >> K;
	for (int i = 0; i < K; i++) {
		int x, y;
		cin >> x >> y;
		sMap[x - 1][y - 1] = 4;
	}

	//뱀의 초기 상태 0, 0 방향은 동쪽 = 0
	queue<pair<int, int>> snack;

	snack.push(make_pair(0, 0));
	sMap[snack.back().first][snack.back().second] = 1;	//맵에 표시
	int moveD = 0;	//방향
	
	//명령 입력 = 맵에 입력해서 초마다 방향전환 명령을 찾는 방식
	map<int, char> Order;

	cin >> L;

	for (int i = 0; i < L; i++) {
		int sec;
		char dir;
		cin >> sec >> dir;
		Order[sec] = dir;
	}

	//solution~~~
	while (1) {
		result++;

		int x = snack.back().first + direct[moveD][0];
		int y = snack.back().second + direct[moveD][1];

		//맵 안에서 움직이는지, 몸과 부딪히지 않았는지 --> 종료조건!!
		if (0 <= x && x < N && 0 <= y && y < N && sMap[x][y] != 1) {

			//일단 이동
			snack.push(make_pair(x, y));
			//사과가 없으면 길이 줄이기
			if (sMap[x][y] != 4) {
				sMap[snack.front().first][snack.front().second] = 0;	//맵에서 뱀 꼬리 지우고
				snack.pop();	//꼬리 댕기고~
			}
			//이동한 위치에 표시
			sMap[x][y] = 1;
		}
		else {
			cout << result << endl;
			return 0;
		}

		//방향 회전
		if (Order.find(result) != Order.end()) {
			if (Order[result] == 'D')
				moveD = (moveD + 1) % 4;
			if (Order[result] == 'L')
				moveD = (moveD + 3) % 4;
		}
	}
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함