티스토리 뷰
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
#include <iostream>
#include <cstring>
#include <vector>
#include <deque>
using namespace std;
int N, K, L;
int Map[101][101]; //1: 사과, 2: 뱀
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
deque<pair<int ,int>> snake; //뱀의 머리와 꼬리 위치 저장
vector<pair<int, char>> V; //int 시간 후 char 방향으로 turn
int time = 0;
bool isPossible(int y, int x)
{
if(y<1 || y>=N+1 || x<1 || x>=N+1)
return false;
return true;
}
int turnDirection(int x, char c)
{
//왼쪽으로 90도 회전
if(c == 'L')
{
if(x==0) return 1;
else if(x==1) return 2;
else if(x==2) return 3;
else if(x==3) return 0;
}
//오른쪽으로 90도 회전
else if(c == 'D')
{
if(x==0) return 3;
else if(x==1) return 0;
else if(x==2) return 1;
else if(x==3) return 2;
}
}
void solve()
{
int y=1, x=1, i=0, idx=0;
//뱀의 처음 위치 저장
snake.push_back(make_pair(y, x));
Map[y][x] = 2;
while(true)
{
//뱀의 방향이 바뀌는 시간이 지난다면
if(idx<V.size() && time == V[idx].first)
{
if(V[idx].second == 'L') i = turnDirection(i, 'L');
else if(V[idx].second == 'D') i = turnDirection(i, 'D');
idx++;
}
time++; //시간 증가
int ny = y + dy[i];
int nx = x + dx[i];
//이동이 불가능하거나, 뱀의 몸통과 부딪힐 때
if(false == isPossible(ny,nx) || 2 == Map[ny][nx])
{
break;
}
//사과가 없을 때 -> 머리 이동 & 꼬리 이동
else if(0 == Map[ny][nx])
{
Map[ny][nx] = 2; //뱀의 위치 변경
Map[snake.back().first][snake.back().second] = 0;
snake.pop_back();
snake.push_front(make_pair(ny, nx));
}
//사과가 있을 때 -> 머리 이동 && 꼬리 고정
else if(1 == Map[ny][nx])
{
Map[ny][nx] = 2;
snake.push_front(make_pair(ny,nx));
}
y = ny;
x = nx;
}
cout << time << '\n';
return ;
}
int main()
{
int i, j; //for loop을 위한 변수
cin >> N >> K;
memset(Map, 0, sizeof((N+1)*(N+1))); //0으로 초기화
//사과 위치 저장
int y, x;
for(i=1; i<=K; i++)
{
cin >> y >> x;
Map[y][x] = 1;
}
cin >> L;
//뱀의 방향이 변하는 <시간, 방향> 저장
int X;
char C;
for(i=1; i<=L; i++)
{
cin >> X >> C;
V.push_back(make_pair(X, C));
}
solve();
return 0;
}
'PS > BOJ C++' 카테고리의 다른 글
16173번 - 점프왕 쩰리 (Small) (0) | 2022.03.20 |
---|---|
11403번 - 경로 찾기 (0) | 2022.02.27 |
1010번 - 다리 놓기 (0) | 2022.02.20 |
1325번 - 효율적인 해킹 (0) | 2022.02.13 |
10971번 - 외판원 순회 2 (0) | 2022.02.13 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 큐
- 1715
- 딕셔너리
- dp
- heapq
- 10971
- 17478
- 파이썬
- 1764
- 스택
- 11051
- 브루트포스
- 덱
- 삼성청년소프트웨어아카데미
- 2805
- 자료구조
- 수학
- 백준
- 10816
- 10845
- 1358
- 싸피
- 조합
- 프로그래머스
- 빌림
- 백트래킹
- 러스트
- 1182
- 1759
- 10815
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함