Problem Description
有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。
Input
输入的第一行包含一个正整数T(T<=20),表示一共有 T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示网格的大小是2行N列。
Output
输出一共有多少种铺设的方法,每组数据的输出占一行。
Sample Input
3
2
8
12
Sample Output
3
171
2731
这道题我用的是DFS(这题也可找规律和DP解决),首先在一个2*n(row = 2,column = n)的空间中,放置的方式有3种,一个种正方形放置,一种是长方形正放(2 * 1),另一种是长方形侧放置(1 * n)。所以,个数就是正方形放置的个数+长方形正放放置的个数+ 长方形侧放放置的个数 = 总数。但是在第一次提交代码的时候TLE了。然后,我们可以想,这个空间的高度(row)是2,如果长方形侧放一个之后,下面如果有剩余的空间,必然也是侧放一个长方形,其实,就等于一个正方形。所以,长方形侧放的个数 = 正方形放置的个数,所以只要将正方形的个数乘于2即可减少一层的递归,即 正方形放置数 * 2+长方形放置数= 总数,以下为AC代码。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while ((T--) != 0) {
int n = sc.nextInt();
System.out.println(dfs(2, n));
}
}
public static int dfs(int row, int column) {
int count = 0;
int dx, dy;
if (row == 2 && column == 0 || row == 0 && column == 2) {
return 1;
} else if (row < 0 || column < 0) {
return 0;
}
//正方形放置
count = count + 2 * dfs(row, column - 2);
//长方形正放
count = count + dfs(row, column - 1);
//长方形侧放
//count = count + dfs(row, column - 2);
return count;
}
}