제민

3190 뱀 본문

코테연습일지/구현 (시뮬레이션)

3190 뱀

jemin0619 2024. 2. 9. 21:20

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

간단하고 재밌던 문제이다. 특정 시간에 어디로 회전하라는 입력을 어떻게 처리할지 고민했는데 char 배열을 만들어서 해결했다. 나쁘지 않은 방법인 것 같다. 

처음엔 꼬리가 길때 머리를 따라오는 것을 어떻게 구현해야 할지 막막했는데 큐나 덱을 사용하면 해결할 수 있었다. 뱀이 이동할 때마다 덱의 Back(꼬리)을 pop하고, Front(머리)에 다음 좌표를 집어넣으면 뱀의 이동을 구현할 수 있다. 

그 후 머리가 몸에 부딪혔을 경우를 감지하기 위해 board에서 뱀이 있는 부분은 1로 했다.

#include <bits/stdc++.h>
using namespace std;

int N,K,L,x,y,dir=0,cnt=0;
int board[103][103];
char movedata[10003];
int dy[4]={0,1,0,-1};
int dx[4]={1,0,-1,0};
//dir 0이 오른쪽임. (90도 오른쪽방향으로 회전) 

deque<pair<int,int>> deq;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>N>>K;
	for(int i=0;i<K;i++){
		int r,c; cin>>r>>c;
		board[r-1][c-1]=2;
	}
	cin>>L;
	for(int i=0;i<L;i++){
		int x; char c;
		cin>>x>>c;
		movedata[x]=c;
	}
	
	//초기 위치 설정 
	deq.push_front({0,0});
	board[0][0]=1;
	
	while(true){
		cnt++;
		int ny=y+dy[dir];
		int nx=x+dx[dir];
		//벽에 부딪혔거나 OOB면 finish; 
		if(ny<0||nx<0||ny>=N||nx>=N||board[ny][nx]==1){ 
			cout<<cnt;
			return 0;
		}
		else{
			//이동한 칸에 사과(2)가 있다면
			if(board[ny][nx]==2){
				deq.push_front({ny,nx});
				board[ny][nx]=1;
			}
			//아니라면
			else{
				board[deq.back().first][deq.back().second]=0;
				deq.pop_back();
				deq.push_front({ny,nx});
				board[ny][nx]=1;
			}
			y=ny; x=nx; 
		}
		//회전하기
		if(movedata[cnt]=='L') dir--;
		if(movedata[cnt]=='D') dir++;
		if(dir<0) dir=3;
		if(dir>3) dir=0;
	}
	cout<<cnt;
	return 0;
}

'코테연습일지 > 구현 (시뮬레이션)' 카테고리의 다른 글

13460 구슬 탈출 2  (1) 2024.02.11
14500 테트로미노  (1) 2024.02.10
14499 주사위 굴리기  (0) 2024.02.07
14891 톱니바퀴  (1) 2024.02.07
11559 Puyo Puyo  (2) 2024.02.07