되면한다
백준 3190. 뱀 (구현) 본문
https://www.acmicpc.net/problem/3190
뱀은 몸 길이를 늘려 머리를 다음 칸에 위치시킨다. 만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다.
1) 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
2) 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다.(몸길이 변화 X)
1. 특징
1) 구현
2. 삽질 포인트
1) 순서 고려를 잘못했다. 문제에 적혀있는 순서는 1) 머리를 다음칸에 위치시키기 2) 벽이나 자기자신의 몸과 부딪히면 게임 끝내기 3) 이동한 칸에 사과 있으면 ~, 사과 없으면 ~.
그런데 나는 이동한 칸에 사과가 없다면, 몸길이 줄여서 꼬리가 위치한 칸을 비워주고 -> 자기자신의 몸과 부딪히면 게임 끝내기를 해버렸다.
3. 구현 포인트
1) 방향전환 관리는 queue로 했다.
2) 뱀의 좌표 관리도 queue로 했다. 뱀이 사과가 없는 곳을 간다면, snake 큐에서 뱀의 마지막 좌표를 꺼내 그 좌표값을 0으로 만들고, 해당 좌표를 큐에서 pop했다.
4. 코드
#include <iostream>
#include <queue>
using namespace std;
int board[102][102]; //기존의 (0,0)이 여기서는 (1,1)
int ans;
int dx[4] = {0, 1, 0, -1}; //오른쪽 아래 왼쪽 위
int dy[4] = {1, 0, -1, 0};
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
int k;
cin >> n;
cin >> k;
int x, y;
for(int i = 0; i < k; i++)
{
cin >> x >> y;
board[x][y] = 1; //사과있는 곳 1
}
queue<pair<int, char>> _queue;
queue<pair<int, int>> snake;
int l;
cin >> l;
int time;
char c;
for(int i = 0; i < l; i++)
{
cin >> time >> c;
_queue.push(make_pair(time, c));
}
//(1, 1)에서 시작하는 것과 관련한 초기 처리
int curx = 1;
int cury = 1;
snake.push(make_pair(curx, cury));
board[curx][cury] = 2;
int dir = 0; // 오른쪽
while(true)
{
ans++;
int nx, ny;
nx = curx + dx[dir];
ny = cury + dy[dir];
if(nx == 0 || nx == n + 1|| ny == 0 || ny == n + 1) break;
if(board[nx][ny] == 2) break;
if(board[nx][ny] != 1)
{
int lastx = snake.front().first;
int lasty = snake.front().second;
board[lastx][lasty] = 0;
snake.pop();
}
board[nx][ny] = 2;
snake.push(make_pair(nx, ny));
curx = nx; cury = ny;
int curtime = _queue.front().first;
if(curtime == ans)
{
char curdir = _queue.front().second;
if(curdir == 'D')
{
dir = (dir + 1) % 4;
}
if(curdir == 'L')
{
dir = (dir + 3) % 4;
}
_queue.pop();
}
}
cout << ans;
}
'코딩테스트준비' 카테고리의 다른 글
백준 14502. 연구소 (조합, 구현) (0) | 2023.07.07 |
---|---|
백준 18428. 감시 피하기 (구현) (0) | 2023.07.05 |
14500. 테트로미노 (구현) (0) | 2023.07.01 |
백준 14499. 주사위 굴리기 (구현) (0) | 2023.07.01 |
백준 15686. 치킨 배달 (구현) (0) | 2023.07.01 |
Comments