// Microsoft OA 51 LPA
// Find min distance between 2 and 3 in a grid with multiple 2 0 and 3
// Multisource BFS
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class PairInt {
int first;
int second;
int parentX;
int parentY;
public PairInt(int first, int second, int parentX, int parentY) {
this.first = first;
this.second = second;
this.parentX = parentX;
this.parentY = parentY;
}
}
public class Main {
public static void main
(String[] args
) {
Scanner scanner
= new Scanner
(System.
in);
int r = scanner.nextInt();
int c = scanner.nextInt();
int[][] grid = new int[r][c];
Queue<PairInt> queue = new LinkedList<>(); // we can also use ArrayDeque implementation but this is more common
boolean[][] seen = new boolean[r][c];
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
grid[i][j] = scanner.nextInt();
if(grid[i][j] == 2) {
queue.offer(new PairInt(i, j, i, j));
seen[i][j] = true;
}
}
}
int currLevel = 0;
int[] dirs = {-1, 0, 1, 0, -1};
while(!queue.isEmpty()) {
int levelSize = queue.size();
for(int i = 0; i < levelSize; i++) {
PairInt curr = queue.poll();
int currX = curr.first;
int currY = curr.second;
for(int j = 0; j < 4; j++) {
int newX = currX + dirs[j];
int newY = currY + dirs[j + 1];
if(newX >= 0 && newX < r && newY >= 0 && newY < c && !seen[newX][newY]) {
if(grid[newX][newY] == 0) {
queue.offer(new PairInt(newX, newY, curr.parentX, curr.parentY));
seen[newX][newY] = true;
} else if (grid[newX][newY] == 3) {
System.
out.
println("Min. Distance: " + (currLevel
+ 1)); System.
out.
println("(O indexed) From (" + curr.
parentX + ", " + curr.
parentY + ") to (" + newX
+ ", " + newY
+ ")"); return;
}
}
}
}
currLevel++;
}
}
}
Ly8gTWljcm9zb2Z0IE9BIDUxIExQQQovLyBGaW5kIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIDIgYW5kIDMgaW4gYSBncmlkIHdpdGggbXVsdGlwbGUgMiAwIGFuZCAzCi8vIE11bHRpc291cmNlIEJGUyAKIAppbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CmltcG9ydCBqYXZhLnV0aWwuUXVldWU7CmltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKIApjbGFzcyBQYWlySW50IHsKIAogICAgaW50IGZpcnN0OwogICAgaW50IHNlY29uZDsKCWludCBwYXJlbnRYOwoJaW50IHBhcmVudFk7CgkKICAgIHB1YmxpYyBQYWlySW50KGludCBmaXJzdCwgaW50IHNlY29uZCwgaW50IHBhcmVudFgsIGludCBwYXJlbnRZKSB7CiAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0OwogICAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOwogICAgICAgIHRoaXMucGFyZW50WCA9IHBhcmVudFg7CiAgICAgICAgdGhpcy5wYXJlbnRZID0gcGFyZW50WTsKICAgIH0KIAp9CiAKcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogCiAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoU3lzdGVtLmluKTsKIAogICAgICAgIGludCByID0gc2Nhbm5lci5uZXh0SW50KCk7CiAgICAgICAgaW50IGMgPSBzY2FubmVyLm5leHRJbnQoKTsKIAogICAgICAgIGludFtdW10gZ3JpZCA9IG5ldyBpbnRbcl1bY107CiAKICAgICAgICBRdWV1ZTxQYWlySW50PiBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsgLy8gd2UgY2FuIGFsc28gdXNlIEFycmF5RGVxdWUgaW1wbGVtZW50YXRpb24gYnV0IHRoaXMgaXMgbW9yZSBjb21tb24KIAogICAgICAgIGJvb2xlYW5bXVtdIHNlZW4gPSBuZXcgYm9vbGVhbltyXVtjXTsKIAogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCByOyBpKyspIHsKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IGM7IGorKykgewogCiAgICAgICAgICAgICAgICBncmlkW2ldW2pdID0gc2Nhbm5lci5uZXh0SW50KCk7CiAKICAgICAgICAgICAgICAgIGlmKGdyaWRbaV1bal0gPT0gMikgewogICAgICAgICAgICAgICAgICAgIHF1ZXVlLm9mZmVyKG5ldyBQYWlySW50KGksIGosIGksIGopKTsKICAgICAgICAgICAgICAgICAgICBzZWVuW2ldW2pdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KIAogICAgICAgIGludCBjdXJyTGV2ZWwgPSAwOwogCiAgICAgICAgaW50W10gZGlycyA9IHstMSwgMCwgMSwgMCwgLTF9OwogCiAgICAgICAgd2hpbGUoIXF1ZXVlLmlzRW1wdHkoKSkgewogCiAgICAgICAgICAgIGludCBsZXZlbFNpemUgPSBxdWV1ZS5zaXplKCk7CiAKICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxldmVsU2l6ZTsgaSsrKSB7CiAKICAgICAgICAgICAgICAgIFBhaXJJbnQgY3VyciA9IHF1ZXVlLnBvbGwoKTsKIAogICAgICAgICAgICAgICAgaW50IGN1cnJYID0gY3Vyci5maXJzdDsKICAgICAgICAgICAgICAgIGludCBjdXJyWSA9IGN1cnIuc2Vjb25kOwogCiAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CiAKICAgICAgICAgICAgICAgICAgICBpbnQgbmV3WCA9IGN1cnJYICsgZGlyc1tqXTsKICAgICAgICAgICAgICAgICAgICBpbnQgbmV3WSA9IGN1cnJZICsgZGlyc1tqICsgMV07CiAKICAgICAgICAgICAgICAgICAgICBpZihuZXdYID49IDAgJiYgbmV3WCA8IHIgJiYgbmV3WSA+PSAwICYmIG5ld1kgPCBjICYmICFzZWVuW25ld1hdW25ld1ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdyaWRbbmV3WF1bbmV3WV0gPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUub2ZmZXIobmV3IFBhaXJJbnQobmV3WCwgbmV3WSwgY3Vyci5wYXJlbnRYLCBjdXJyLnBhcmVudFkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bbmV3WF1bbmV3WV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWRbbmV3WF1bbmV3WV0gPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW4uIERpc3RhbmNlOiAiICsgKGN1cnJMZXZlbCArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKE8gaW5kZXhlZCkgRnJvbSAoIiArIGN1cnIucGFyZW50WCArICIsICIgKyBjdXJyLnBhcmVudFkgKyAiKSB0byAoIiArIG5ld1ggKyAiLCAiICsgbmV3WSArICIpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAKICAgICAgICAgICAgY3VyckxldmVsKys7CiAgICAgICAgfQogCiAgICB9Cn0=