# 13346 - DomoMaze
## Brief
This DomoMaze can be described as a two-dimensional array. With width W and length L, Domo is at the position (0, 0) in the beginning, and Wilson is at the position (W-1, L-1).
Each time Domo moves, he can choose one of three ways below:
1. from (i, k) to (i+1, k)
2. from (i, k) to (i, k+1)
3. from (i, k) to (i+1, k+1)
Also, there are some portals in the maze. If you step into a certain position (i, k) where has a portal, you will be immediately teleported to the position (i-2, k-2), and the portal you used will disappear.
It is guaranteed that the position (i-2, k-2) is in the DomoMaze, and the portal will not appear at (W-1, L-1).
Given the size of DomoMaze and the position of all portals, please find out how many ways Domo can find Wilson.
## Input
The first line contains two integers W (1 ≤ W ≤ 15) and L (1 ≤ L ≤ 15) - the width and the length of DomoMaze
For the next W lines, each line has L numbers either 1 or 0 - 0 for empty, and 1 for the portal.
The variable range of each test case is different.
For test cases 1 ~ 4, there is no portal in the DomoMaze.
For test case 5, there is one portal in the DomoMaze.
For test case 6, there are two portals in the DomoMaze.
## Output
The output only contains a number and a newline character - the number of ways Domo can reach where Wilson is.
It's guaranteed that the answer will not be greater than $2^{31}-1$.
## Solution
```c=
//by 莊景堯
#include <stdio.h>
int dp[20][20][4];
int x[2] = {-1, -1};
int y[2] = {-1, -1};
int idx;
int main() {
int w, h;
scanf("%d %d", &w, &h);
getchar();
for (int i = 1; i <= w; i++) {
for (int k = 1; k <= h; k++)
if (getchar() == '1') {
x[idx] = i;
y[idx] = k;
idx++;
}
getchar();
}
dp[0][0][3] = 1;
for (int bit = 3; bit >= 0; bit--) {
for (int i = 1; i <= w; i++)
for (int k = 1; k <= h; k++) {
int sum = dp[i-1][k][bit] + dp[i][k-1][bit] + dp[i-1][k-1][bit];
int not_tp = 1;
if (x[0] == i && y[0] == k && (bit % 2)) {
not_tp = 0;
dp[i][k][bit] = 0;
dp[i-2][k-2][bit-1] += sum;
}
if (x[1] == i && y[1] == k && bit >= 2) {
not_tp = 0;
dp[i][k][bit] = 0;
dp[i-2][k-2][bit-2] += sum;
}
if (not_tp)
dp[i][k][bit] += dp[i-1][k][bit] + dp[i][k-1][bit] + dp[i-1][k-1][bit];
}
}
printf("%d\n", dp[w][h][0] + dp[w][h][1] + dp[w][h][2] + dp[w][h][3]);
}
```