|
@@ -10,8 +10,16 @@ long long dp[2][N];
|
|
|
|
|
|
int h, w;
|
|
int h, w;
|
|
|
|
|
|
-bool is_match(int i, int j) {
|
|
|
|
-
|
|
|
|
|
|
+void dfs(int i, int j, int curr, int next) {
|
|
|
|
+ if (j == w) {
|
|
|
|
+ dp[i ^ 1][next] += dp[i][curr];
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ int mask = 1 << j;
|
|
|
|
+ if ((mask & curr) > 0) dfs(i, j + 1, curr, next);
|
|
|
|
+ if ((mask & curr) == 0) dfs(i, j + 1, curr, next | mask);
|
|
|
|
+ if (((mask & curr) > 0) && (((mask << 1) & curr) > 0))
|
|
|
|
+ dfs(i, j + 2, curr, (next | mask) | (mask << 1));
|
|
}
|
|
}
|
|
|
|
|
|
int main() {
|
|
int main() {
|
|
@@ -19,14 +27,15 @@ int main() {
|
|
if (h == 0 && w == 0) break;
|
|
if (h == 0 && w == 0) break;
|
|
memset(dp, 0, sizeof(dp));
|
|
memset(dp, 0, sizeof(dp));
|
|
dp[0][(1 << w) - 1] = 1;
|
|
dp[0][(1 << w) - 1] = 1;
|
|
- int cur = 1;
|
|
|
|
|
|
+ int cur = 0;
|
|
for (int i = 0; i < h; i++) {
|
|
for (int i = 0; i < h; i++) {
|
|
|
|
+ memset(dp[cur ^ 1], 0, sizeof(dp[cur ^ 1]));
|
|
for (int j = 0; j < N; j++) {
|
|
for (int j = 0; j < N; j++) {
|
|
- for (int k = 0; k < N; k++) {
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ if (dp[cur][j] != 0) dfs(cur, 0, j, 0);
|
|
}
|
|
}
|
|
|
|
+ cur ^= 1;
|
|
}
|
|
}
|
|
|
|
+ printf("%lld\n", dp[cur][(1 << w) - 1]);
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|