杭电2501_Tiling_easy version——java

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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值