알고리즘&자료구조/문제

[BOJ] 3190 뱀 C++

Nakuri 2023. 2. 23. 21:41
728x90

개요

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

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

골드4 난이도 문제다.

풀이

문제를 보고 딱 큐가 떠올랐다.

머리가 늘어나고 꼬리가 사라지는 선입선출 구조!

이동하며 머리가 한 칸 늘어난다.(queue에 push)

이동한 곳에 아무것도 없는 경우 꼬리를 줄이고(queue를 pop) 사과가 있을 경우에는 그대로 진행한다.

만약 뱀 자기 자신이나 벽이 있으면 게임 오버 처리를 해준다.

방향은 1차원 배열을 따로 만들어서 index를 time으로 사용하고 value로 회전 값을 넣어 놓았다.

 

이 문제 게임 만드는 것 같고 참 재밌었다.

강추!!

코드

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
constexpr int LIMIT = 102;
constexpr int dy[] = { 0,1,0,-1 };
constexpr int dx[] = { 1,0,-1,0 };

int N, K, L;
int board[LIMIT][LIMIT];
int turn[LIMIT * LIMIT];
int dir;
queue<pair<int, int>> snakeQ;

int solution()
{
	int time = 0;
	int ny = 1;
	int nx = 1;
	snakeQ.push({ ny,nx });
	while (!snakeQ.empty())
	{
		dir += turn[time];
		if (dir < 0) dir = 3;
		if (dir > 3) dir = 0;

		ny += dy[dir];
		nx += dx[dir];
		time++;

		queue<pair<int, int>> q = snakeQ;
		while (!q.empty())
		{
			if (q.front().first == ny && q.front().second == nx)
				return time;
			q.pop();
		}
		if (ny == 0 || nx == 0 || ny > N || nx > N)
			return time;

		snakeQ.push({ ny, nx });
		if (board[ny][nx]) board[ny][nx] = 0;
		else snakeQ.pop();
	}
	return time;
}
int main()
{
	cin.tie(0)->sync_with_stdio(0);

	cin >> N >> K;
	int ay;
	int ax;
	for (int i = 0; i < K; i++)
	{
		cin >> ay >> ax;
		board[ay][ax] = 1;
	}
	cin >> L;
	int X;
	char C;
	for (int i = 0; i < L; i++)
	{
		cin >> X >> C;
		if (C == 'L') turn[X] = -1;
		else turn[X] = 1;
	}

	int ans = solution();
	cout << ans;
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 4195 친구 네트워크 C++  (0) 2023.02.23
[BOJ] 1717 집합의 표현 C++  (0) 2023.02.23
[BOJ] 9024 두 수의 합 C++  (0) 2023.02.23
[BOJ] 1253 좋다 C++  (0) 2023.02.23
[BOJ] 7453 합이 0인 네 정수 C++  (0) 2023.02.23