陣取りのターン数 Java編（中途）【paiza Aランクレベルアップメニュー】

https://qiita.com/shidoh78/items/a2311fe28d0bdac4d908

　昨日の続き、一週間詰まっている本題である。なお本来のＡランク相当問題はこの次。

　書き出して手間を省いたので、詰まっていた部分はぬるっとクリア出来た（入力例２）。
**　ただし最後の判定で上手くいってないので、まだ完全解答ではない。**
　整理するための備忘録。

```java: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;
    }
}
```

　入力例２で詰まっていたのはこういうミスだったわけだ。

//この時nを越えた時点でIndexOutになる。lcountがn-1に来た時点で増加処理を通させない
//→一度上限まで来てしまったら判定の必要がないと言える
**//増加条件を「一致したとき」にしてしまうと、最初の一回でlcountが動いてしまう（これ！！！**

```java
//愚直にこんなことやってたわけだ
if(l[lcount] == d && lcount < n-1){
    //（？にする処理）
    lcount++;
}
```

　落ち着いて考えてみれば「そりゃそうだ」なのだが、あれこれ一気に考えすぎて忘れる＆疲れて見落とす。そういう例。


　さて問題は最後の入力である。
　入力例そのものはチケット使用（有料）なのでいったん置くが、「狭い陣で１つ刻み。だが最後の一手が?にならない」である。
　最後の一回をスルーしてしまうようなので、条件判定を見直さねばならない。

　いったんここまで。