Tile Code 拼木板

本文介绍了一个关于“绿色松坡”自行车交通系统项目,其中每个自行车将被赋予一个长度为n的瓷砖编码,由1×2、2×1和2×2的瓷砖在2×n矩形板上构成,不重叠且覆盖所有单元格。问题求解如何统计不同瓷砖编码的数量,分别针对奇数和偶数长度的编码给出了不同的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3904 - Tile Code
Asia - Seoul - 2007/2008
PDF   Submit   Ranking

 

The city of Songpa is now carrying out a project to build a bicycle transportation system called 鈥榞reen Songpa.鈥?By the end of this year, citizens and visitors alike will be able to pick up and drop off bicycles throughout the city. Recently, it was decided to attach a number tag to each bicycle for management use. The bicycles will be under control of the city鈥檚 traffic system.

The number tag contains a tile code of length n , which consists of 1×2 , 2×1 , and 2×2 tiles placed on a 2×n rectangular plate in a way that every cell of the plate is covered by exactly one tile. The plate is divided into 2n cells of size 1×1 . Of course, no two tiles are allowed to overlap each other. The 2×5 plate and a tile code of length 5 are shown in Figures 1 and 2, respectively. The code will always be read from left to right. However, there is no distinction between the top side and the bottom side of the code. The code may be turned upside down. The code shown in Figure 3 is essentially the same code as in Figure 2.


 
Given a positive integer n , the project director Dr. Yang wants to know how many tile codes of length n there are, that is, the number of ways to place the three kinds of tiles into a 2×n rectangular plate subject to the above conditions. Write a program that can help him.


Input 
Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case is given in a single line, which contains a positive integer n , 3n30 .


Output 
Your program is to write to standard output. Print exactly one line for each test case. The line should contain the number of tile codes of length n .


Sample Input 

2
3
4


Sample Output 

3
8

cnt[i]保存的是不忽略左右顺序的,但是左右不能重复;ans保存的是忽略左右顺序的,
当i是奇数的时候,中间是一条2*1的板,左右重复的情况一共是cnt[i/2],cnt[i]+cnt[i/2]表示不忽略左右顺序从左到右和从右到左两种情况之和,故ans[i]= (cnt[i]+cnt[i/2])/2;
当i是偶数的时候,有三种情况:中间是2*2,中间是两个1*2,和中间是一条缝,此时左右重复的分别是cnt[i/2-1],cnt[i/2-1],cnt[i/2],cnt[i]+cnt[i/2]+cnt[i/2-1]+cnt[i/2-1]表示不忽略左右顺序从左到右和从右到左两种情况之和,故ans[i]=(cnt[i]+cnt[i/2]+cnt[i/2-1]*2)/2;


#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int cnt[40]={0,1,3};
    for(int i=3;i<=30;i++) cnt[i]=cnt[i-1]+2*cnt[i-2];
    int ans[40]={0,1,3};
    for(int i=3;i<=30;i++)
    {
        if(i&1)  ans[i]=(cnt[i]+cnt[i/2])/2;
        else ans[i]=(cnt[i]+cnt[i/2]+cnt[i/2-1]*2)/2;
    }  
    int ci;scanf("%d",&ci);
    while(ci--)
    {
        int n;
        scanf("%d",&n);
        printf("%d/n",ans[n]);
    }
    return 0;
}       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值