#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <deque>
#define ll long long
using namespace std;
int N,K,L;
char board[120][120];
vector<pair<int,char>> info;
deque<pair<int,int>> snake;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
int DIR = 1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N;
cin >> K;
for(int i=0;i<N;i++)
fill(board[i], board[i]+N, '.');
for(int i=0;i<K;i++)
{
int a,b;
cin >> a >> b;
board[a-1][b-1] = 'A';
}
cin >> L;
for(int i=0;i<L;i++)
{
int a;
char c;
cin >> a >> c;
info.push_back({a,c});
}
snake.push_back({0,0});
board[0][0] = 's';
int idx=0, time=0;
while(true)
{
if((idx < info.size()) and (info[idx].first == time)){
if(info[idx].second == 'L'){
DIR--;
if(DIR < 0) DIR += 4;
}else{
DIR++;
if(DIR > 3) DIR -= 4;
}
idx++;
}
++time;
auto cur = snake[0];
int ny = cur.first + dy[DIR];
int nx = cur.second + dx[DIR];
if(nx<0 or ny<0 or nx>=N or ny>=N){
goto stop;
break;
}
if(board[ny][nx] == 's'){
goto stop;
break;
}
pair<int,int> pre = cur;
bool apple = false;
if(board[ny][nx] == 'A'){
board[ny][nx] = 's';
snake.push_front({ny, nx});
apple = true;
}else{
board[ny][nx] = 's';
board[cur.first][cur.second] = '.';
snake[0] = {ny, nx};
}
if(!apple)
{
for(int size=1;size<snake.size();size++)
{
auto tmp = snake[size];
board[pre.first][pre.second] = 's';
board[tmp.first][tmp.second] = '.';
snake[size] = pre;
pre = tmp;
}
}
}
stop:;
cout << time;
return 0;
}
- 로직
board[][]
판에 사과의 위치
를 'A'
로 표시 / 나머지
는 '.'
time변수
를 늘려가면서 진행하며, DIR변수
를 사용해서 방향
을 컨트롤
(상 우 하 좌
순서
로 배치한 뒤 오른쪽 회전 ==>dir증가
/ 왼쪽 회전 ==> dir감소
)
뱀
이 DIR 방향
으로 이동한 점
이 벽
이거나 자신의 몸
이면 바로 종료!
뱀
의 가장 앞 머리
를 옮기는데 사과를 먹으면
몸통은 그대로
두어야 한다!
: 머리
만 늘어나고
나머지 몸통
은 동일
하기 때문
사과를 먹지 않았을 경우
나머지 몸
은 앞 좌표
를 따라가도록 구현