题意:求用4种类型的矩形拼成4*N的方法个数,其中2*2的必须且只能用到一次,回溯的尝试放的矩形,起初return的位置错了,注意我们每次只尝试放一种,且一定能放的下1*1的矩形(在满足题意的情况下),所以return要放在1*1的里面,起初我放在了两个for的外面破坏了递归的结构
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int flag,n,m=4; int vis[5][5],ans; bool in(int x,int y){ return x < n && y < m; } void dfs(int cnt){ if (flag && cnt == n*m){ ans++; return; } if (cnt >= n*m) return; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++){ if (!flag && in(i+1,j+1) && !vis[i][j] && !vis[i+1][j+1] && !vis[i+1][j] && !vis[i][j+1]){ vis[i][j] = vis[i+1][j] = vis[i][j+1] = vis[i+1][j+1] = 1; flag = 1; dfs(cnt+4); vis[i][j] = vis[i+1][j] = vis[i][j+1] = vis[i+1][j+1] = 0; flag = 0; } if (in(i+1,j) && !vis[i][j] && !vis[i+1][j]){ vis[i+1][j] = vis[i][j] = 1; dfs(cnt+2); vis[i][j] = vis[i+1][j] = 0; } if (in(i,j+1) && !vis[i][j] && !vis[i][j+1]){ vis[i][j] = vis[i][j+1] = 1; dfs(cnt+2); vis[i][j] = vis[i][j+1] = 0; } if (!vis[i][j]){ vis[i][j] = 1; dfs(cnt+1); vis[i][j] = 0; return; } } } int main(){ int t; scanf("%d",&t); while (t--){ scanf("%d",&n); memset(vis,0,sizeof(vis)); flag = 0; ans = 0; dfs(0); printf("%d\n",ans); } return 0; }