main.cc 927 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. const int H = 11, W = 11;
  5. const int N = 1 << W;
  6. long long dp[2][N];
  7. int h, w;
  8. void dfs(int i, int j, int curr, int next) {
  9. if (j == w) {
  10. dp[i ^ 1][next] += dp[i][curr];
  11. return;
  12. }
  13. int mask = 1 << j;
  14. if ((mask & curr) > 0) dfs(i, j + 1, curr, next);
  15. if ((mask & curr) == 0) dfs(i, j + 1, curr, next | mask);
  16. if (((mask & curr) > 0) && (((mask << 1) & curr) > 0))
  17. dfs(i, j + 2, curr, (next | mask) | (mask << 1));
  18. }
  19. int main() {
  20. while (scanf("%d %d", &h, &w) != EOF) {
  21. if (h == 0 && w == 0) break;
  22. memset(dp, 0, sizeof(dp));
  23. dp[0][(1 << w) - 1] = 1;
  24. int cur = 0;
  25. for (int i = 0; i < h; i++) {
  26. memset(dp[cur ^ 1], 0, sizeof(dp[cur ^ 1]));
  27. for (int j = 0; j < N; j++) {
  28. if (dp[cur][j] != 0) dfs(cur, 0, j, 0);
  29. }
  30. cur ^= 1;
  31. }
  32. printf("%lld\n", dp[cur][(1 << w) - 1]);
  33. }
  34. return 0;
  35. }