| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 959 人关注过本帖
标题:C语言铺地砖问题
只看楼主 加入收藏
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
结帖率:77.78%
收藏
已结贴  问题点数:10 回复次数:5 
C语言铺地砖问题
铺地砖

Time Limit:1000MS  Memory Limit:65536K
Total Submit:711 Accepted:224

Description

元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?

Input

首先输入一个整数T,表示有T组测试数据
然后是T行,每行输入1个正整数n(n<=50)

Output

对于每个n输出铺的方法种数

Sample Input


3
1
2
3

Sample Output
1
2
4
我想的是先穷举面积和等于n的所有情况,再排列组合
可是这个程序运行还行,交上去不知道为什么runtime error,说可能有除以0的情况
我在前面写了两个阶乘函数
#include<stdio.h>//kan xia si da de dai ma!
int F(int n)
{
    int i,p;
    p=1;
    for(i=1;i<=n;i++)
    {
        p*=i;
    }
    return p;
}
int f(int m,int n)
{
    int i,p;
    p=1;
    for(i=n-m+1;i<=n;i++)
    {
        p*=i;
    }
    return p;
}
int main()
{
    int T,i,n,count,j,k,l,m;
    scanf("%d",&T);
    for(i=0;i<T;i++)
    {
        count=0;
        scanf("%d",&n);
        for(j=0;j<=50;j++)
        {
            for(k=0;k<=25;k++)
            {
                for(l=0;l<=16;l++)
                {
                    if(n==j+2*k+3*l)
                    {m=j+k+l;
                     count+=F(m)-(F(j)-1)*(f(j,m)/F(j))-(F(k)-1)*(f(k,m)/F(k))-(F(l)-1)*(f(l,m)/F(l));//所有排列情况减去重复的情形
                    }
                }
               
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


搜索更多相关主题的帖子: Memory 铺地砖 C语言 长方形 正整数 
2013-12-25 10:40
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
或者大家有更好方法,求教~~!
2013-12-25 10:41
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
注意int的范围!

总有那身价贱的人给作业贴回复完整的代码
2013-12-25 10:45
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
回复 3楼 embed_xuel
那要怎么改?
2013-12-25 11:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
对于1*n地面,第一块可以放1X1,也可以放1X2,也可以放1X3
也就是 f(n) = f(n-1) + f(n-2) + f(n-3);
因此你可以写个递归
unsigned foo( unsigned n )
{
    if(n==1u) return 1u;
    if(n==2u) return 2u;
    if(n==3u) return 4u;
    return foo(n-1) + foo(n-2) + foo(n-3);
}

这递归一看就知道效率很差,因此可以反过来做
f(4) = f(1)+f(2)+f(3);
f(5) = f(2)+f(3)+f(4);
f(6) = f(3)+f(4)+f(5);
……
一直到你需要的f(n)
2013-12-25 11:15
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
谢谢楼上 明白了
2013-12-25 15:50
快速回复:C语言铺地砖问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017082 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved