3190번 : 뱀 (C++)

2023. 7. 15. 22:55·알고리즘/백준

LOGIC

  1. 현재 시간에 1 더하기
  2. 다음 뱀의 위치 구하기
    1. 다음 위치가 맵이 아니라면 게임 오버
    2. 다음 위치가 빈 맵이라면
      1. 다음 위치로 머리 이동
      2. 뱀의 머리 추가
      3. 맵에서 꼬리 삭제
      4. 뱀의 꼬리 삭제
    3. 다음 위치가 사과라면
      1. 다음 위치로 머리 이동
      2. 뱀의 머리 추가
    4. 다음 위치가 뱀의 몸통이라면 게임 오버
  3. 이동 정보에 해당하는 시간이라면
    1. 방향 바꾸기
  4. 현재 위치 업데이트
  5. 게임이 끝날때 까지 반복

CODE

#include <iostream>
#include <queue>
#include <deque>

using namespace std;

int N, K, L;
int map[101][101] = { 0, };
deque<pair<int, int>> snake; // x좌표, y좌표
queue<pair<int, char>> change; // 방향 바꾸는 시간, 좌표
int curTime = 0;
int x = 0, y = 0;

int dir = 0;
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };

void print()
{
	cout << ":::::::::::::::::::" << endl;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cout << map[i][j] << " ";
		}
		cout << endl;
	}
	cout << ":::::::::::::::::::" << endl;
}

int main()
{
	cin >> N >> K;

	//사과 정보 넣기
	int ax, ay;
	for (int i = 0; i < K; i++)
	{
		cin >> ax >> ay;
		map[ax - 1][ay - 1] = 1;
	}

	cin >> L;

	//방향 전환 정보 넣기
	int ctime;
	char direction;
	for (int i = 0; i < L; i++)
	{
		cin >> ctime >> direction;
		change.push(make_pair(ctime, direction));
	}

	snake.push_back(make_pair(0, 0));
	map[0][0] = 2;

	while (true)
	{
		curTime++;
		//cout << "순서: " << curTime << endl;

		int nx = x + dx[dir];
		int ny = y + dy[dir];

		if (nx < 0 || ny < 0 || nx >= N || ny >= N) // 맵이 아닐때
		{
			//cout << "게임 오버 : 맵 밖으로 나감" << endl;
			break;
		}

		if (map[nx][ny] == 0) // 빈 맵 일때
		{
			map[nx][ny] = 2; //머리 이동
			snake.push_front(make_pair(nx, ny));// 뱀 머리 추가
			map[snake.back().first][snake.back().second] = 0; // 맵에서 꼬리 삭제
			snake.pop_back();// 뱀에서 꼬리 삭제
		}
		else if (map[nx][ny] == 1) // 사과 일때
		{
			//cout << "사과 먹음" << endl;
			map[nx][ny] = 2; //머리 이동
			snake.push_front(make_pair(nx, ny));// 뱀 머리 추가
		}
		else if (map[nx][ny] == 2) // 뱀의 몸통일때
		{
			//cout << "게임 오버 : 뱀의 몸에 부딪힘" << endl;
			break;
		}

		if (change.size() == 0) {}
		else if (curTime == change.front().first)
		{
			//cout << "방향 바꿈" << endl;

			char direction = change.front().second;
			change.pop();

			if (direction == 'L') // 왼쪽으로 돌기
			{
				if (dir == 0) dir = 2;
				else if (dir == 1) dir = 3;
				else if (dir == 2) dir = 1;
				else if (dir == 3) dir = 0;
			}
			else if (direction == 'D') // 오른쪽으로 돌기
			{
				if (dir == 0) dir = 3;
				else if (dir == 1) dir = 2;
				else if (dir == 2) dir = 0;
				else if (dir == 3) dir = 1;
			}
		}

		x = nx;
		y = ny;
		//print();
	}

	cout << curTime << endl;

}

'알고리즘 > 백준' 카테고리의 다른 글

12738번 : 가장 긴 증가하는 부분 수열 3  (0) 2023.10.18
17413 : 단어 뒤집기 (C++)  (0) 2023.07.15
15486번 : 퇴사2(JAVA)  (0) 2022.11.06
17143번 : 낚시왕(JAVA)  (1) 2022.10.31
16234번 : 인구 이동 (JAVA)  (1) 2022.10.09
'알고리즘/백준' 카테고리의 다른 글
  • 12738번 : 가장 긴 증가하는 부분 수열 3
  • 17413 : 단어 뒤집기 (C++)
  • 15486번 : 퇴사2(JAVA)
  • 17143번 : 낚시왕(JAVA)
가든_
가든_
  • 가든_
    Code Garden
    가든_
  • 전체
    오늘
    어제
    • 글 목록 (60)
      • 프로그래밍 언어 (11)
        • JAVA (0)
        • C++ (2)
        • C# (9)
      • 개발툴 (24)
        • Visual Studio (0)
        • Visual Studio Code (1)
        • Eclipse (1)
        • Unity (19)
        • Unreal (0)
        • Spring (1)
        • SpringBoot (0)
        • Vue (2)
      • 디자인 패턴 (6)
      • 백엔드 (4)
        • MySQL (1)
        • Servlet (3)
      • 프론트엔드 (4)
        • HTML (3)
        • CSS (0)
        • Javascript (1)
      • 알고리즘 (10)
        • 공식 (3)
        • 백준 (6)
        • SW Expert Academy (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DI
    Adaptee
    런타임 상수
    chatGPT
    RDBM
    Abstract Factory 패턴
    행동 UML 다이어그램
    Reflex
    HTML
    MVC
    컴파일 상수
    UniRX
    SetTile
    오브젝터 어댑터
    FixedUpdate
    스택
    c#
    구조적 UML 다이어그램
    Adapter 패턴
    Factory 패턴
    Unity
    클래스 어댑터
    Java
    12738
    Proxy 패턴
    swea2112
    다이어그램 그리기
    구조패턴
    상태공간트리
    ()=>
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
가든_
3190번 : 뱀 (C++)
상단으로

티스토리툴바