문제 : https://www.acmicpc.net/problem/3190
3190번: 뱀
문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따
www.acmicpc.net
문제 요약 : 게임의 끝나는 시간을 계산하시오
| 입력 | 출력 |
|
2 ≤ N(크기) ≤ 100 0 ≤ K(사과) ≤ 100 K줄의 사과 좌표 1 ≤ L(회전) ≤ 100 L줄의 시간과 회전방향(D, L) |
게임이 끝나는 시간 |
JAVA
| 채점 번호 | 아이디 | 문제 번호 | 결과 | 메모리 | 시간 | 언어 | 코드 길이 |
| 16349741 | cbkpar | 3190 | 맞았습니다!! | 13608KB | 84ms | Java | 1749B |
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,k,l,i;
String str = "";
//입력 받는 부분
n = Integer.parseInt(br.readLine());
int[][] board = new int[n][n];
board[0][0]=2;
k = Integer.parseInt(br.readLine());
int[][] tail = new int[k+2][2];
int tail_length = 1;
for(i=0;i<k;i++) {
str = br.readLine();
String[] arr = str.split(" ");
board[Integer.parseInt(arr[0])-1][Integer.parseInt(arr[1])-1]=1;
}
l = Integer.parseInt(br.readLine());
int[][] move = new int[l+1][2];
for(i=0;i<l;i++) {
str = br.readLine();
String[] arr = str.split(" ");
move[i][0] = Integer.parseInt(arr[0]);
if(arr[1].charAt(0)=='D') {
move[i][1] = 1; // 오른쪽
}else {
move[i][1] = 3; // 왼쪽
}
}
move[l][0]=0; // index에러 방지를 위해 마지막 움직임 추가
move[l][1]=0;
int[] dy = {-1,0,1,0}; // 위 오른쪽 아래 왼쪽 순서
int[] dx = {0,1,0,-1};
int moven = 0; // 회전방향순서
int direction = 1; // 방향
int time = 0; // 게임 진행 시간
int nx = 0; // 현재 x
int ny = 0; // 현재 y
while(true) {
time++; //시간을 1증가
nx+=dx[direction]; // 현재 x좌표 갱신
ny+=dy[direction]; // 현재 y좌표 갱신
if(nx<0||nx>=n) break; // 벽에 부딪히면 종료
if(ny<0||ny>=n) break;
if(board[ny][nx]==2) break; // 자기자신에 부딪히면 종료
if(board[ny][nx]==1) { // 사과먹을 경우
//꼬리 뒤로 보내는 부분
for(i=tail_length-1;i>=0;i--) {
tail[i+1][0] = tail[i][0];
tail[i+1][1] = tail[i][1];
}
tail[0][0] = ny;
tail[0][1] = nx;
tail_length++; // 꼬리길이 증가
board[ny][nx]=2;
}
if(board[ny][nx]==0) {
board[ny][nx]=2;
//꼬리 뒤로 보내는 부분
for(i=tail_length-1;i>=0;i--) {
tail[i+1][0] = tail[i][0];
tail[i+1][1] = tail[i][1];
}
tail[0][0]=ny;
tail[0][1]=nx;
board[tail[tail_length][0]][tail[tail_length][1]]=0;
}
if(move[moven][0]==time) { //시간과 방향움직이는 시간이 같다면
direction = (direction+move[moven++][1])%4; // 왼쪽과 오른쪽으로 꺾음
}
}
System.out.println(time); // 게임시간 출력
}
}
'백준온라인' 카테고리의 다른 글
| [백준온라인] 14499번 주사위 굴리기 (0) | 2019.12.04 |
|---|---|
| [백준온라인] 13458번 시험 감독 (0) | 2019.12.04 |
| [백준온라인] 12100번 2048 (Easy) (0) | 2019.12.03 |
| [백준온라인] 2884번 알람 시계 (0) | 2019.12.02 |
| [백준온라인] 13460번 구슬 탈출 2 (0) | 2019.12.01 |