-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行目の出力ゲームは数秒で終了します.
    入力例16 3 3 4 2 5 5 3 3 3 D 15 L 17 Dサンプル出力19入力例2
    104 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に入れ,リンゴを食べなかった場合は以前の値を入れて減算する.
    これは体現しなければならない問題で、考えた後に放棄する問題です.しかし、適切に実施すれば、問題を解決しやすい.