알고리즘 공부
백준 뱀
컴퓨터과학
2023. 12. 5. 00:47
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
아 흠 꼬리와 사과부분 처리가 조금 까다로웠던 문제네요 .. ㅠㅠ
import java.util.*;
import java.lang.*;
import java.lang.reflect.Array;
import java.io.*;
public class Main {
static class Snake{
private int i;
private int j;
private int d;
public Snake(int i,int j,int d) {
this.i=i;
this.j=j;
this.d=d;
}
public void i(int i) {
this.i=i;
}
public void j(int j) {
this.j=j;
}
public void d(int d) {
this.d=d;
}
public int i() {
return i;
}
public int j() {
return j;
}
public int d() {
return d;
}
}
public static void main(String[] args) throws Exception {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int [][]maps=new int [n+1][n+1];
boolean [][]bcheck=new boolean [n+1][n+1];
//먼저 뱀이 몸길이를 늘려 머리를 다음칸에 위치시킨다
//만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다
//만약 이동한 칸에 사과가 잇다면 그칸에 잇던 사과가 없어지고 꼬리는 움직이지 않는다
//만약에 이동칸에 사과가 없다면 몸길이를 줄여서 꼬리가 위치칸을 비워준다 즉 몸길이는 변하지 않는다
//사과의 위치와 뱀의 이동 경로가 주어질 때 이게임이 몇초에 끝나는지 계산하여라
int k=scan.nextInt();
for(int i=0;i<k;i++) {
int x,y;
x=scan.nextInt();
y=scan.nextInt();
maps[x][y]=1;
}
//0 오른쪽 1 아래 2 왼쪽 3 위
Snake snake=new Snake(1,1,0);
Snake tail=new Snake(1,1,0);
Deque<Snake>dq=new LinkedList<>();
dq.add(new Snake(1,1,0));
bcheck[1][1]=true;
//l 왼쪽 90도
//d 오른쪽 90도
int diri[]= {0,1,0,-1};
int dirj[]= {1,0,-1,0};
int l=scan.nextInt();
int sec=0;
int prev=0;
int x=0;
boolean bEnd=false;
for(int i=0;i<l;i++) {
int tmpx=scan.nextInt();
char c=scan.next().charAt(0);
x=tmpx-prev;
prev=tmpx;
int dir=snake.d();
for(int j=0;j<x;j++) {
int tmpDiri=diri[dir]+snake.i();
int tmpDirj=dirj[dir]+snake.j();
if(tmpDiri==0||tmpDirj==0||tmpDiri>=n+1||tmpDirj>=n+1) {
//벽
i=l+1;
sec++;
bEnd=true;
break;
}
if( bcheck[tmpDiri][tmpDirj]==true) {
//뱀 몸
bEnd=true;
sec++;
i=l+1;
break;
}
//apple?
if(maps[ tmpDiri ][ tmpDirj ]==1) {
maps[tmpDiri][tmpDirj]=0;//eating apple
}else {
//not apple
Snake tmpTail=dq.getFirst();
dq.poll();
int taili=tmpTail.i();
int tailj=tmpTail.j();
bcheck[ taili ][ tailj ]=false;
}
bcheck[tmpDiri][tmpDirj]=true;
dq.add(new Snake(tmpDiri,tmpDirj,0));
snake.i(tmpDiri);
snake.j(tmpDirj);
sec++;
}
if(c=='L') {
dir=dir-1;
if(dir<0) {
dir=3;
}
}else if(c=='D') {
dir=dir+1;
dir=dir%4;
}
snake.d(dir);
}
if(bEnd==false) {
while(true) {
int dir=snake.d();
int tmpDiri=diri[dir]+snake.i();
int tmpDirj=dirj[dir]+snake.j();
if(tmpDiri==0||tmpDirj==0||tmpDiri>=n+1||tmpDirj>=n+1) {
//벽
sec++;
break;
}
if( bcheck[tmpDiri][tmpDirj]==true) {
//뱀 몸
sec++;
break;
}
Snake tmpTail=dq.peekFirst();
dq.pollFirst();
int taili=tmpTail.i();
int tailj=tmpTail.j();
bcheck[ taili ][ tailj ]=false;
bcheck[tmpDiri][tmpDirj]=true;
snake.i(tmpDiri);
snake.j(tmpDirj);
dq.add(snake);
sec++;
}
}
System.out.print(sec);
}
}