昨日の続き、一週間詰まっている本題である。なお本来のAランク相当問題はこの次。
書き出して手間を省いたので、詰まっていた部分はぬるっとクリア出来た(入力例2)。
** ただし最後の判定で上手くいってないので、まだ完全解答ではない。**
整理するための備忘録。
Main.java
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();
int n = 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("*")){
q.add(new XY(i, j, 1)); //スタート地点(初期値のy, x, 1が入っている)
}
}
}
int l[] = new int[n];
int lcount = 0; //引数
for(int i=0; i<n; i++){
l[i] = sc.nextInt();
}
Arrays.sort(l); //?にする手番を昇順に格納
while(q.size() > 0){
XY xy = q.poll();
int y = xy.y;
int x = xy.x;
int d = xy.d;
String in = "*"; //書き込むテキスト。初期値は*。
if(l[0] == 0 && d == 1 && lcount < n){ //初期地点を?にする場合
map[y][x] = "?";
lcount++;
}
//dがl[lcount]と同じなら?を入れる
//lcountを1増やす
//この時nを越えた時点でIndexOutになる。lcountがn-1に来た時点で増加処理を通させない
//→一度上限まで来てしまったら判定の必要がないと言える
//増加条件を「一致したとき」にしてしまうと、最初の一回でlcountが動いてしまう
//l[lcount]の値がdより小さいとき
if(l[lcount] == d){
in = "?";
}
if(l[lcount] < d && lcount < n-1){
lcount++;
}
if(y > 0 && map[y-1][x].equals(".")){ //上
map[y-1][x] = in;
q.add(new XY(y-1, x, d+1));
}
if(y < h-1 && map[y+1][x].equals(".")){ //下
map[y+1][x] = in;
q.add(new XY(y+1, x, d+1));
}
if(x < w-1 && map[y][x+1].equals(".")){ //右
map[y][x+1] = in;
q.add(new XY(y, x+1, d+1));
}
if(x > 0 && map[y][x-1].equals(".")){ //左
map[y][x-1] = in;
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;
}
}
入力例2で詰まっていたのはこういうミスだったわけだ。
//この時nを越えた時点でIndexOutになる。lcountがn-1に来た時点で増加処理を通させない
//→一度上限まで来てしまったら判定の必要がないと言える
//増加条件を「一致したとき」にしてしまうと、最初の一回でlcountが動いてしまう(これ!!!
//愚直にこんなことやってたわけだ
if(l[lcount] == d && lcount < n-1){
//(?にする処理)
lcount++;
}
落ち着いて考えてみれば「そりゃそうだ」なのだが、あれこれ一気に考えすぎて忘れる&疲れて見落とす。そういう例。
さて問題は最後の入力である。
入力例そのものはチケット使用(有料)なのでいったん置くが、「狭い陣で1つ刻み。だが最後の一手が?にならない」である。
最後の一回をスルーしてしまうようなので、条件判定を見直さねばならない。
いったんここまで。