-5を実施します.蛇.
27824 ワード
質問する
「Dummy」というドスゲームがありました.このゲームには蛇が這い出していて、りんごを食べると蛇の長さが増えます.ヘビが這い回って、壁や自分の体にぶつかって、ゲームは終わりました.
ゲームはNxN正方形の碁盤で行われ、一部の格にはりんごが置かれている.板の上下左右端に壁があります.ゲーム開始時、ヘビは一番上の一番左側にあり、ヘビの長さは1です.蛇は最初は右です.
ヘビは毎秒移動し、次のルールに従います.
リンゴの位置と蛇の移動経路を与えると,このゲームは数秒で終了する.
最初の行は、プレートのサイズNを与える.(2≦N≦100)次の行はリンゴの個数Kを与える.(0 ≤ K ≤ 100)
次のK行はリンゴの位置を示し,1番目の整数は行を表し,2番目の整数は列の位置を表す.りんごの位置が違います.一番上の左側(1行1列)にはりんごがありません.
次の行は蛇の方向転換回数Lを与える.(1 ≤ L ≤ 100)
以下のL行は蛇の方向変換情報を提供し,整数Xと文字Cからなる.ゲーム開始時間からX秒終了後に左(Cは「L」)または右(Cは「D」)に90度回転します.Xは10000以下の正の整数であり、方向変換情報はXが増加する順に与えられる.
しゅつりょく
1行目の出力ゲームは数秒で終了します.
入力例1
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D
サンプル出力19
入力例210
4
1 2
1 3
1 4
1 5
4
8 D
10 D
11 D
13 L
サンプル出力221
入力例310
5
1 5
1 3
1 2
1 6
17
4
8 D
10 D
11 D
13 L
サンプル出力313
インプリメンテーションコード
import java.util.*;
import java.io.*;
class Node{
private int time;
private char direction;
Node(int time, char direction){
this.time = time;
this.direction = direction;
}
public int getTime(){
return this.time;
}
public char getDirection(){
return this.direction;
}
}
class Position{
private int x;
private int y;
Position(int x, int y){
this.x = x;
this.y = y;
}
public int getX(){
return this.x;
}
public int getY(){
return this.y;
}
}
public class Main{
public static ArrayList<Node>turn = new ArrayList<>(); // 회전 리스트
public static int[][] nn;
public static int[] dx = {0, 1, 0, -1};
public static int[] dy = {1, 0, -1, 0};
public static int n ,t;
public static int turning(int direction, char c){
if (c == 'L') direction = (direction == 0)? 3 : direction - 1;
else direction = (direction + 1) % 4;
return direction;
}
public static int simulation(){
int x = 1;
int y = 1;
nn[x][y] = 2; // 뱀 장로 2로 할당.
int direction = 0;
int index = 0;
int time = 0;
Queue<Position>queue = new LinkedList<>();
queue.offer(new Position(x,y));
while(true){
int nx = x + dx[direction];
int ny = y + dy[direction];
// 벽에 부딪히지 않고 뱀의 몸통이 없는 위치일 때.
if(1 <= nx && nx <= n && 1 <= ny && ny <= n && nn[nx][ny] != 2){
if(nn[nx][ny] == 0){
nn[nx][ny] = 2;
queue.offer(new Position(nx,ny));
Position prev = queue.poll();
nn[prev.getX()][prev.getY()] = 0;
}
if(nn[nx][ny] == 1){
nn[nx][ny] = 2;
queue.offer(new Position(nx,ny));
}
}
// 벽이나 뱀의 몸통과 부딪혔다면
else{
time++;
break;
}
x = nx;
y = ny;
time++;
if(index < t && time == turn.get(index).getTime()){
direction = turning(direction, turn.get(index).getDirection());
index ++;
}
}
return time;
}
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 배열 할당변수
n = Integer.parseInt(br.readLine());
// 사과개수
int a = Integer.parseInt(br.readLine());
StringTokenizer st;
nn = new int[n+1][n+1]; // 배열할당
for(int i = 0 ; i < a; i ++){ // 사과 1로 변경
st = new StringTokenizer(br.readLine());
nn[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())] = 1;
}
// 회전 개수
t = Integer.parseInt(br.readLine());
for(int i = 0 ; i < t; i ++){ //
st = new StringTokenizer(br.readLine());
turn.add(new Node(Integer.parseInt(st.nextToken()), st.nextToken().charAt(0)));
}
System.out.println(simulation());
}
}
コード解釈
蛇の問題を解決するために
1.謝罪の表現方法
2.回転の表現方法
3.時間の経過に伴う回転方法
4.ヘビの体をどう表現するか
まず、りんごは配列値に1で表示すればいいと思います.
回転は右側を基準にして、東、南、西、北X、Yを指定します.
ArrayListに時間と方向を入力
Queueを用いてx,y座標を入れ,配列に2と表示し,リンゴを食べた場合はqueueに入れ,リンゴを食べなかった場合は以前の値を入れて減算する.
これは体現しなければならない問題で、考えた後に放棄する問題です.しかし、適切に実施すれば、問題を解決しやすい.
Reference
この問題について(-5を実施します.蛇.), 我々は、より多くの情報をここで見つけました https://velog.io/@cse05091/구현-5.-뱀テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol