int go (x, y) { if (x + 1 == W) { \\ 1) x = 0; y++; } if (y == H) \\ 2) return 1; if (A[x, y]) \\ 3) return go(x + 1, y); // if (m.count(x, y, A)) \\ *) // return M[x, y, A]; int res = 0; if ((x + 1 < W) && (A[x + 1, y] == 0)) { \\ 4) A[x, y] = A[x + 1, y] = 1; res += go(x + 1, y); A[x, y] = A[x + 1, y] = 0; } if ((y + 1 < H) && (A[x, y + 1] == 0)) { \\ 5) A[x, y] = A[x, y + 1] = 1; res += go(x, y + 1); A[x, y] = A[x, y + 1] = 0; } return M[x, y, A]; }