import java.util.ArrayList;
class Maze {
Maze(int[] stuff) {}
};
class Main {
public static final int R = 1;
public static final int L = -1;
public static final int U = -4;
public static final int D = 4;
public static final int[] mov = new int[] {R,L,U,D};
public static int remaining = 0;
public static ArrayList<Maze> mazes = new ArrayList<>();
public static void main
(String[] arg
) { generateMazes("0");
System.
out.
println(mazes.
size()); }
public static boolean solutionExists(int[] a, int k) {
if (a[0] == 2) return true;
if (a[k] == 2) return false;
for (int m : mov) {
if (canMove(a, k, m)) {
a[k] = 2;
boolean f = solutionExists(a, k+m);
a[k] = 0;
if (f) return true;
}
}
return false;
}
public static void generateMazes
(String layout
) { if (layout.length() == 16) {
if (layout.charAt(15) == '1') return;
int[] a = new int[16];
for (int i
= 0; i
< 16; i
++) a
[i
] = Character.
digit(layout.
charAt(i
),
10); if (solutionExists(a, 15)) mazes.add(new Maze(a));
return;
}
generateMazes(layout+'1');
generateMazes(layout+'0');
}
public static boolean canMove(int[] a, int pos, int dir) {
int npos = pos + dir;
if (npos < 0 || npos >= 16) return false;
if (a[npos] == 1) return false;
if (dir == 1 && pos % 4 == 3) return false;
if (dir == -1 && pos % 4 == 0) return false;
return Math.
abs((npos
- pos
) % 4) <= 1; }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CgpjbGFzcyBNYXplIHsgCglNYXplKGludFtdIHN0dWZmKSB7fQp9OwoKY2xhc3MgTWFpbiB7CiAgIAogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUiA9IDE7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMID0gLTE7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVID0gLTQ7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEID0gNDsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gbW92ID0gbmV3IGludFtdIHtSLEwsVSxEfTsKIAogICAgcHVibGljIHN0YXRpYyBpbnQgcmVtYWluaW5nID0gMDsKICAgCiAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxNYXplPiBtYXplcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmcpIHsKICAgICAgICBnZW5lcmF0ZU1hemVzKCIwIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1hemVzLnNpemUoKSk7CiAgICB9CiAgIAogICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNvbHV0aW9uRXhpc3RzKGludFtdIGEsIGludCBrKSB7CiAgICAgICAgaWYgKGFbMF0gPT0gMikgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKGFba10gPT0gMikgcmV0dXJuIGZhbHNlOwogICAgICAgCiAgICAgICAgZm9yIChpbnQgbSA6IG1vdikgewogICAgICAgICAgICBpZiAoY2FuTW92ZShhLCBrLCBtKSkgewogICAgICAgICAgICAgICAgYVtrXSA9IDI7CiAgICAgICAgICAgICAgICBib29sZWFuIGYgPSBzb2x1dGlvbkV4aXN0cyhhLCBrK20pOwogICAgICAgICAgICAgICAgYVtrXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoZikgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlTWF6ZXMoU3RyaW5nIGxheW91dCkgewogICAgICAgIGlmIChsYXlvdXQubGVuZ3RoKCkgPT0gMTYpIHsKICAgICAgICAgICAgaWYgKGxheW91dC5jaGFyQXQoMTUpID09ICcxJykgcmV0dXJuOwogICAgICAgICAgIAogICAgICAgICAgICBpbnRbXSBhID0gbmV3IGludFsxNl07CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgYVtpXSA9IENoYXJhY3Rlci5kaWdpdChsYXlvdXQuY2hhckF0KGkpLCAxMCk7CiAgICAgICAgICAgIGlmIChzb2x1dGlvbkV4aXN0cyhhLCAxNSkpIG1hemVzLmFkZChuZXcgTWF6ZShhKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAKICAgICAgICBnZW5lcmF0ZU1hemVzKGxheW91dCsnMScpOwogICAgICAgIGdlbmVyYXRlTWF6ZXMobGF5b3V0KycwJyk7CiAgICB9CiAgIAogICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhbk1vdmUoaW50W10gYSwgaW50IHBvcywgaW50IGRpcikgewogICAgICAgIGludCBucG9zID0gcG9zICsgZGlyOwogICAgICAgIGlmIChucG9zIDwgMCB8fCBucG9zID49IDE2KSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGFbbnBvc10gPT0gMSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChkaXIgPT0gMSAmJiBwb3MgJSA0ID09IDMpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoZGlyID09IC0xICYmIHBvcyAlIDQgPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgCiAgICAgICAgcmV0dXJuIE1hdGguYWJzKChucG9zIC0gcG9zKSAlIDQpIDw9IDE7CiAgICB9CiAgIAp9