就是红色是2*2,黄色一格,蓝色1 × 2,黑色2 × 1.
必有 有且只有有一个红色,剩下随意,
问有几种摆法。用回溯。
#include<iostream>
using namespace std;
const int N = 5;
int vis[N][N];
int num;
int res;
bool red;
void init () {
for (int i = 0 ; i < N ; i ++) {
for (int j = 0 ; j < N ;j++) {
vis[i][j] = 0;
}
}
res = 0 ;
red = false;
}
void dfs (int k , int p , int l) {
if (k == num * 4 && red) {
res++;
return;
}
for (int i = p ; i < num ;i++) {
for (int j = l ; j < 4 ;j++) {
if (!vis[i][j] && !vis[i][j + 1] && !vis[i + 1][j] && !vis[i + 1][j + 1] && !red && i < num - 1 && j < 3) {
vis[i][j] = vis[i][j + 1] = vis[i + 1][j] = vis[i + 1][j + 1] = 2;
red = true;
dfs(k + 4, i + (j + 1) / 4 , ( j + 1) % 4);
red = false;
vis[i][j] = vis[i][j + 1] = vis[i + 1][j] = vis[i + 1][j + 1] = 0;
}
if (!vis[i][j] && !vis[i][j + 1] && j < 3 && i < num) {
vis[i][j] = vis[i][j + 1] = 3;
dfs(k + 2 , i + (j + 1) /4 , (j + 1) % 4);
vis[i][j] = vis[i][j + 1] = 0;
}
if (!vis[i][j] && !vis[i + 1][j] && j < 4 && i < num - 1) {
vis[i][j] = vis[i + 1][j] = 4;
dfs(k + 2, i + (j + 1) /4 ,(j + 1) % 4);
vis[i][j] = vis[i + 1][j] = 0;
}
if(!vis[i][j]) {
vis[i][j] = 5;
dfs(k + 1,i + (j + 1) / 4,(j+1) % 4);
vis[i][j] = 0;
}
if (j == 3)
l = 0;
}
}
}
int main () {
int t ;
cin >> t;
while (t--) {
cin >> num;
init();
if(num == 1) {
cout << "0" <<endl;
continue;
}
dfs(0,0,0);
cout << res << endl;
}
}