题意:一道蓝桥杯填空题风格的题目,向网格里插入2*2,1*2,2*1,1*1的矩形,填满网格,有且只有一个2*2的矩形,问总共有多少种填法
思路:直接暴力搜索就行
#include <stdio.h>
#include <string.h>
int vis[4][4];
int n;
int ans;
bool judge(int x,int y){
if(x >= 0 && y >= 0 && x < n && y < 4 && !vis[x][y]){
return true;
}
return false;
}
int flag;
void dfs(int num){
if(num == n * 4 && flag == 1){
ans++;
return;
}
if(num >= n * 4){
return;
}
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if(judge(i,j) && judge(i,j + 1) && judge(i + 1, j) && judge(i + 1, j + 1) && !flag){
flag = 1;
vis[i][j] = vis[i][j + 1] = vis[i + 1][j] = vis[i + 1][j + 1] = 1;
dfs(num + 4);
flag = 0;
vis[i][j] = vis[i][j + 1] = vis[i + 1][j] = vis[i + 1][j + 1] = 0;
}
if(judge(i,j) && judge(i,j + 1)){
vis[i][j] = vis[i][j + 1] = 1;
dfs(num + 2);
vis[i][j] = vis[i][j + 1] = 0;
}
if(judge(i,j) && judge(i + 1,j)){
vis[i][j] = vis[i + 1][j] = 1;
dfs(num + 2);
vis[i][j] = vis[i + 1][j] = 0;
}
if(judge(i,j)){
vis[i][j] = 1;
dfs(num + 1);
vis[i][j] = 0;
//想一想return为什么要放到这里?
return;
}
}
}
}
int main(void){
int t;
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
ans = 0;
flag = 0;
scanf("%d",&n);
dfs(0);
printf("%d\n",ans);
}
return 0;
}