728x90
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
반복문으로 뱀이 계속 이동하도록 한다.
1. 앞으로 전진
1) 이동한 칸이 벽이거나 자신이면 게임 끝
2) 이동한 칸에 사과가 있다면, 그 칸에 있던 사과는 없어지고 꼬리는 움직이지 않음 -> 3번에서 진행
이동한 칸에 사과가 없다면, 몸길이를 줄여 꼬리가 위치한 칸을 비워준다. 몸길이는 변하지 않음
3) 뱀 길이 추가, 뱀 머리 이동
2. 방향 회전 명령이 담겨있는 v가 비어있지 않고, 현재 시간이 명령을 수행할 시간이라면 회전, 맨 앞 명령 pop
여기서 사과는 1, 뱀은 2로 표시해줬다.
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
//사과를 먹으면 뱀 길이가 늘어난다. 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
//NxN보드 위, 사과가 놓여져있고 보드의 상하좌우 끝에 벽이 있다.
//게임이 몇 초에 끝나는지 계산
//사과1, 빈칸0
//뱀머리위치 x y, 방향 d
//좌측 상단에서 뱀이 위치하고 뱀의 길이는 1. 처음엔 오른쪽을 향한다.
//1. 몸 길이를 늘려 머리를 다음칸에 위치
//2. 이동한 칸에 사과가 있다면, 그 칸에 있던 사과는 없어지고 꼬리는 움직이지 않음
//3. 이동한 칸에 사과가 없다면, 몸길이를 줄여 꼬리가 위치한 칸을 비워준다. 몸길이는 변하지 않음
int n, k, l;
int x = 1, y = 1, d = 0;
int arr[101][101];
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int timeSnake = 1;
queue<pair<int, int>> snake;
queue<pair<int, char>> v;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> k;
arr[1][1] = 2;
snake.push({1, 1}); //뱀 꼬리
bool finish = false;
while(k--){
int a, b;
cin >> a >> b;
arr[a][b] = 1; //사과
}
cin >> l;
while(l--){
int z; char c;
cin >> z >> c;
v.push({z, c});
}
while(1){
//앞으로 전진
int dx = x + dir[d][0];
int dy = y + dir[d][1];
//이동한 칸이 벽이거나 자신이면 게임 끝
if((0>=dx||dx>n||0>=dy||dy>n) || arr[dx][dy] == 2) {
cout << timeSnake << '\n';
finish = true; //게임 끝
break;
}
//2. 이동한 칸에 사과가 있다면, 그 칸에 있던 사과는 없어지고 꼬리는 움직이지 않음
//3. 이동한 칸에 사과가 없다면, 몸길이를 줄여 꼬리가 위치한 칸을 비워준다. 몸길이는 변하지 않음
if(arr[dx][dy] != 1) { //사과가 없다면
arr[snake.front().first][snake.front().second] = 0; //꼬리 위치칸 0으로 변경 -> 꼬리 비워줌
snake.pop();
}
arr[dx][dy] = 2; //뱀 길이 추가
snake.push({dx, dy}); //뱀 길이 추가
x = dx; y = dy; //뱀 머리 이동
timeSnake++;
if(!v.empty() && timeSnake - 1 == v.front().first) { //rotate
d = v.front().second == 'L' ? (4+(d-1))%4 : (d+1)%4;
v.pop(); //회전하는 경우 pop
}
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/swift] 1475번: 방 번호 (0) | 2022.12.13 |
---|---|
[백준/c++] 14500번: 테트로미노 (0) | 2022.11.24 |
[백준/c++] 5427번: 불 (0) | 2022.11.17 |
[백준/c++] 14499번: 주사위 굴리기 (0) | 2022.11.16 |
[백준/c++] 14719번: 빗물 (0) | 2022.11.15 |