CSES - Laatikko

Olet n \times m -labyrintissa ruudussa X, ja tehtäväsi on työntää ruudussa B oleva laatikko ruutuun Y. Jokainen ruutu on joko lattiaa (.) tai seinää (#), ja jokainen reunalla oleva ruutu on seinää.

Voit työntää laatikkoa kulkemalla sitä päin, jolloin siirryt laatikon ruutuun ja laatikko siirtyy askeleen kulkusuuntaan. Mikä on pienin mahdollinen määrä askelia työntää laatikko maaliruutuun?

Voit olettaa, että 1 \le n, m \le 20. Jos ratkaisua ei ole olemassa, palauta -1.

Python

Toteuta tiedostoon pushbox.py funktio count, joka antaa pienimmän askelten määrän.

def count(r):
    # TODO

if __name__ == "__main__":
    r = ["########",
         "#......#",
         "#.#.Y#.#",
         "#.#B.#.#",
         "#..X.#.#",
         "#.#..#.#",
         "########"]
    print(count(r)) # 18

Java

Toteuta tiedostoon Pushbox.java metodi count, joka antaa pienimmän askelten määrän.

public class Pushbox {
    public int count(String[] r) {
        // TODO
    }

    public static void main(String[] args) {
        Pushbox p = new Pushbox();
        String[] r = {"########",
                      "#......#",
                      "#.#.Y#.#",
                      "#.#B.#.#",
                      "#..X.#.#",
                      "#.#..#.#",
                      "########"};
        System.out.println(p.count(r)); // 18
    }
}