白駿1063号(Java)


インプリメンテーション


Javaで白準1063号の実装問題を解決しました.最初は正しいのですが、長い間不必要なことをしていて、ちょっとおかしいと思ったので、コードを再び簡単にしました.どんなシャベルを使っているか見てみましょう.
質問のリンクだけを添付します.
https://www.acmicpc.net/problem/1063

不要なタスクをクリア


私がこの問題をするシャベルは私の習慣的な解答が捨てられないためで、問題の条件に従ってすることができなくて、自分の方式によってするしかなくて、これはやっと気を解きやすいです.
問題条件はmap[0][1]等ではなくA1B8等で与えられる.これまで解いた問題は一般的な2次元配列であったが,ここではこの問題特有のマーキング方式を用いた.
しかし,ここでの焦点は1格移動ごとにrowとcolが+1,−1となる点で変わりはない.しかし、私が以前よく知っていた方法で解決しなければならず、転換方法の犬の糞行為をしなければならない.
以下のコードは、実行좌표 ->문제 표기방식문제 표기방식 -> 좌표の方法を記述しています.
static Pos chessToMap(String pos){
        Pos position;
        char chessCol = pos.charAt(0);
        char chessRow = pos.charAt(1);
        int mapRow; int mapCol;

        mapRow = Math.abs(Character.getNumericValue(chessRow)-8);
        mapCol = Character.getNumericValue(chessCol) - 10;
        position = new Pos(mapRow, mapCol);

        return position;
    }

    static String posToChess(Pos a){
        int row = Math.abs(a.row-8);
        int col = a.col + 65;
        char cCol = (char) col;
        return String.valueOf(cCol) + String.valueOf(row);
    }
どうせ1つの格だけを移動する原理は同じですが、いったいなぜ編んだのでしょうか.本当に犬の血だ.)

グリッド移動の原理は同じです


最終的には1つの格だけ移動すればいい!!
次に、コマンドとコマンドに従って位置を移動する方法を示します.
static char[] move(String cmd, char[] target){
        char[] result = target.clone();
        switch(cmd){
            case "R":
                result[0]++;
                break;
            case "L":
                result[0]--;
                break;
            case "B":
                result[1]--;
                break;
            case "T":
                result[1]++;
                break;
            case "RT":
                result[0]++;    result[1]++;
                break;
            case "LT":
                result[0]--;    result[1]++;
                break;
            case "RB":
                result[0]++;    result[1]--;
                break;
            case "LB":
                result[0]--;    result[1]--;
        }
        return result;
    }
こんなに簡単なのに.
次は私が提出したコードです.
import java.util.*;
import java.io.*;

public class boj1063 {
    static char[] king, rock;
    static int n;

    public static void main(String args[]) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer stk = new StringTokenizer(bfr.readLine()," ");
        king = stk.nextToken().toCharArray(); rock = stk.nextToken().toCharArray(); n = Integer.parseInt(stk.nextToken());
        for(int i=0; i<n; i++) {
            String cmd = bfr.readLine();
            char[] next_king = move(cmd, king);
            if(isInRange(next_king)){ // 킹 움직였더니 일단 범위 안에는 있음
                if(next_king[0]==rock[0] && next_king[1]==rock[1]){ // 킹 움직였더니 돌이랑 겹치면
                    char[] next_rock = move(cmd,rock);
                    if(isInRange(next_rock)){ // 움직인 돌도 범위 안에 있으면
                        king = next_king;
                        rock = next_rock;
                    }
                    else    continue; // 돌이 범위 밖으로 나가면 이번 명령 무시
                }
                else{ // 킹 움직였더니 돌이랑 겹치진 않으면 킹만 움직이면 됨
                    king = next_king;
                }
            }
            else    continue; // 킹 움직였더니 범위 밖으로 나가면 명령 무시
        }

        bfw.write(String.valueOf(king[0]) + String.valueOf(king[1]) + "\n");
        bfw.write(String.valueOf(rock[0]) + String.valueOf(rock[1]));
        bfw.close();
    }

    static Boolean isInRange(char[] a){
        if(a[0]<'A' || a[0]>'H' || a[1]<'1' || a[1]>'8')    return false;
        else return true;
    }

    static char[] move(String cmd, char[] target){
        char[] result = target.clone();
        switch(cmd){
            case "R":
                result[0]++;
                break;
            case "L":
                result[0]--;
                break;
            case "B":
                result[1]--;
                break;
            case "T":
                result[1]++;
                break;
            case "RT":
                result[0]++;    result[1]++;
                break;
            case "LT":
                result[0]--;    result[1]++;
                break;
            case "RB":
                result[0]++;    result[1]--;
                break;
            case "LB":
                result[0]--;    result[1]--;
        }
        return result;
    }
}

犬の糞をしても間違いない.ほほほ

きょう習った

  • 心地よい草だけに執着しないで
  • 問題で与えられた条件をコードに変換しようと努力する