paiza Aランクレベルアップメニュー
https://paiza.jp/works/mondai/a_rank_level_up_problems/problem_index?language_uid=java
Javaで挑戦中。22問目で詰まっている。
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step5
うまく?マークが記載されないのだが、毎回打ち直してエネルギー使ってるのが最高に非効率だと気が付く。
「さあここから処理を考えるぞ」というタイミングで疲れ切っていてヒントを呑み込めないのはどうかと……
・毎度コードを書き直すのが大変
・せっかくアカウント持ってるんだからQiita使え
・問題集は解答を外部に記載しても良い
ということなので、まずは21問目の回答を備忘録として置いておく。
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step4
import java.util.*;
import java.util.Queue;
import java.util.ArrayDeque;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int h = sc.nextInt();
int w = sc.nextInt();
String map[][] = new String[h][w]; //陣
Queue<XY> q = new ArrayDeque<>(); //キュー
for(int i=0; i<h; i++){ //初期化
String temp = sc.next();
for(int j=0; j<w; j++){
map[i][j] = String.valueOf(temp.charAt(j));
if(map[i][j].equals("*")){
map[i][j] = "0"; //最初は0に書き換える
q.add(new XY(i, j, 1)); //スタート地点(初期値のy, x, 1が入っている)
}
}
}
while(q.size() > 0){
XY xy = q.poll();
int y = xy.y;
int x = xy.x;
int d = xy.d;
if(y > 0 && map[y-1][x].equals(".")){ //上
map[y-1][x] = String.valueOf(d);
q.add(new XY(y-1, x, d+1));
}
if(y < h-1 && map[y+1][x].equals(".")){ //下
map[y+1][x] = String.valueOf(d);
q.add(new XY(y+1, x, d+1));
}
if(x < w-1 && map[y][x+1].equals(".")){ //右
map[y][x+1] = String.valueOf(d);
q.add(new XY(y, x+1, d+1));
}
if(x > 0 && map[y][x-1].equals(".")){ //上
map[y][x-1] = String.valueOf(d);
q.add(new XY(y, x-1, d+1));
}
}
for(int i=0; i<h; i++){ //出力
for(int j=0; j<w; j++){
System.out.print(map[i][j]);
}
System.out.println("");
}
}
}
class XY{
int y;
int x;
int d;
XY(int y, int x, int d){
this.y = y;
this.x = x;
this.d = d;
}
}
参考:
https://qiita.com/aja_min/items/fed640d6835eb343eedf
https://jpliterature.hatenablog.com/entry/java-breadth-first-search-1
「あ、そうか。クラスを作れば三次配列めいたことができるのか……」
「お前は大学やオンラインスクールで何をやっとったんじゃ」
使わないと忘れるということですね。いやはや。