以前做过这题,今天又写了一次,突然发现写了一个好漂亮的DFS……(是不是太自恋了 - -#)
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 typedef __int64 ll; 8 9 int n, m; 10 ll dp[12][1<<11]; 11 12 void dfs(int turn, int now, int next, int cnt) { 13 if (cnt > n) return ; 14 if (cnt==n) { 15 dp[turn+1][next] += dp[turn][now]; 16 return ; 17 } 18 if (!(now&(1<<cnt))) { //如果cnt格没放,那就必须放 19 dfs(turn, now, next|(1<<cnt), cnt+1); //放一个竖着的 20 if (!(now&(1<<(cnt+1))) && (cnt<n-1)) dfs(turn, now, next, cnt+2); //放一个横着的 21 } else dfs(turn, now, next, cnt+1); //如果这格被上一层的占了,那这一格就不能放任何东西 22 } 23 24 int main() { 25 #ifdef Phantom01 26 freopen("PKU2411.txt", "r", stdin); 27 #endif // Phantom01 28 29 while (scanf("%d%d", &n, &m)!=EOF) { 30 if (n==0&&m==0) return 0; 31 32 if ((n*m)&1) { 33 puts("0"); 34 continue; 35 } 36 memset(dp, 0, sizeof(dp)); 37 dp[0][0] = 1; 38 for (int i = 0; i < m; i++) 39 for (int j = 0; j < (1<<n); j++) if (dp[i][j]) 40 dfs(i, j, 0, 0); 41 printf("%I64d ", dp[m][0]); 42 } 43 }