FZU - 2107 Hua Rong Dao

题目大意:给出n(1≤n≤4)然后在一个n * 4的格子上放矩形,必须放一个2*2的(为题目背景下的曹操),然后剩余的位置要用三种矩形拼接


解题思路:先枚举曹操的位置,然后用回溯的方式枚举出所有可能,计算总数

#include <cstdio>

int A[5][5] = {0}, ans, n;

void DFS(int i, int j) {
	if (i > n)
		ans++;
	else if (A[i][j])
		DFS(i + j / 4, j % 4 + 1);
	else {
		if (i < n && !A[i+1][j]) {
			A[i][j] = A[i+1][j] = 1;
			DFS(i, j);
			A[i][j] = A[i+1][j] = 0;
		}

		if (j < 4 && !A[i][j+1]) {
			A[i][j] = A[i][j+1] = 1;
			DFS(i, j);
			A[i][j] = A[i][j+1] = 0;
		}

		A[i][j] = 1;
		DFS(i, j);
		A[i][j] = 0;
	}
}

int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		ans = 0;
		scanf("%d", &n);
		for (int i = 1; i < n; i++)
			for (int j = 1; j < 4; j++) {
				A[i][j] = A[i+1][j] = 1;
				A[i][j+1] = A[i+1][j+1] = 1;
				DFS(1, 1);
				A[i][j] = A[i+1][j] = 0;
				A[i][j+1] = A[i+1][j+1] = 0;
			}

		printf("%d\n", ans);
	}
	return 0;
}


你可能感兴趣的:(FZU - 2107 Hua Rong Dao)