白駿1063号(Java)
29628 ワード
インプリメンテーション
Javaで白準1063号の実装問題を解決しました.最初は正しいのですが、長い間不必要なことをしていて、ちょっとおかしいと思ったので、コードを再び簡単にしました.どんなシャベルを使っているか見てみましょう.
質問のリンクだけを添付します.
https://www.acmicpc.net/problem/1063
不要なタスクをクリア
私がこの問題をするシャベルは私の習慣的な解答が捨てられないためで、問題の条件に従ってすることができなくて、自分の方式によってするしかなくて、これはやっと気を解きやすいです.
問題条件はmap[0][1]
等ではなくA1
・B8
等で与えられる.これまで解いた問題は一般的な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;
}
}
犬の糞をしても間違いない.ほほほ
きょう習った
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);
}
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;
}
}
Reference
この問題について(白駿1063号(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@topqr123q/백준-1063번-자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol