设 g ( n ) g(n) g(n)是 3 × n 3\times n 3×n棋盘的多米诺骨牌完美覆盖的数量。估计 g ( 1 ) , g ( 2 ) , ⋯   , g ( 6 ) g(1),g(2),\cdots,g(6) g(1),g(2),⋯,g(6).
#include <stdio.h>
#define N 6
int map[3][N];
int cnt = 0;
void out(){
int i, j;
for (i = 0; i < 3;i++){
for (j = 0; j < N;j++){
printf("%d ", map[i][j]);
}
printf("\n");
}
printf("-----------\n");
}
void dfs(int x, int y, int num){
if(num==3*N/2){
cnt++;
out();
return;
}
while(!(x<3&&y<N&&map[x][y]==0)){
y++;
if(y>=N){
x++;
y = 0;
}
if(x==3){
return;
}
}
if(y<N-1&&map[x][y+1]==0){
map[x][y] = num+1;
map[x][y + 1] = num+1;
dfs(x, y + 2, num + 1);
map[x][y] = 0;
map[x][y + 1] = 0;
}
if(x<2&&map[x+1][y]==0){
map[x][y] = num+1;
map[x + 1][y] = num+1;
dfs(x, y + 1, num + 1);
map[x][y] = 0;
map[x + 1][y] = 0;
}
}
int main(){
dfs(0, 0, 0);
printf("%d\n", cnt);
}