题目链接:fzu2107
题目大意:给一张N * 4的表,分别有2 * 2的方块1个以及多个1 * 2,2 * 1, 1 * 1的方块,要求将这张表填满,问有几种填法。N < 4
解题思路:DFS模拟填表的过程(队友尝试手推…orz 自己其实挺怕这种问填法的,导致连模拟都没尝试写,甚至一度以为是状压DP啥的,傻…)。
Code:
#include <iostream>
#include <string.h>
using namespace std;
int mp[5][5], ans[5] = {0, 0, 18};
int n;
inline void op1 (int x, int y, int k) {
mp[x][y] = k;
mp[x + 1][y] = k;
mp[x][y + 1] = k;
mp[x + 1][y + 1] = k;
}
inline void op2 (int x, int y, int k) {
mp[x][y] = k;
mp[x + 1][y] = k;
}
inline void op3 (int x, int y, int k) {
mp[x][y] = k;
mp[x][y + 1] = k;
}
inline void op4 (int x, int y, int k) {
mp[x][y] = k;
}
void DFS (int x, int y, int s) {
if (x == n + 1) {
if (s == 0) {
ans[n]++; //遍历完一组情况
}
return ;
}
if (y == 5) {
DFS(x + 1, 1, s);
return ;
}
if (mp[x][y] != 0) {
DFS(x, y + 1, s);
return ;
}
if (s == 1) {
if (x == n) { //check
return ;
} else if (y <= 3 && mp[x][y + 1] == 0) {
op1(x, y, 1);
DFS (x, y + 1, 0);
op1(x, y, 0);
}
}
if (x < n) {
op2(x, y, 2);
DFS(x, y + 1, s);
op2(x, y, 0);
}
if (y <= 3 && mp[x][y + 1] == 0) {
op3(x, y, 3);
DFS(x, y + 1, s);
op3(x, y, 0);
}
op4(x, y, 4);
DFS(x, y + 1, s);
op4(x, y, 0);
}
int main() {
int T;
// n = 2, DFS(1, 1, 1);
memset(mp, 0, sizeof(mp));
n = 3; DFS(1, 1, 1);
memset(mp, 0, sizeof(mp));
n = 4; DFS(1, 1, 1);
cin >> T;
while (T--) {
cin >> n;
cout << ans[n] << endl;
}
return 0;
}