免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3330 | 回复: 1
打印 上一主题 下一主题

瓷砖覆盖问题——from《编程之美》 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-08 11:56 |只看该作者 |倒序浏览

               
               
               
                #!/usr/bin/env python
#coding=utf-8
# this problem stems from Beauty of Programming pp.281
# the problem is stated as follows:
#   assume there's a 8x8 floor, the worker need to cover
#   the floor in bricks, which are 1x2 dimension. the
#   question is: how many manners to layout bricks in the
#   floor? what about NxM floor? What about NxM floor and
#   the brick's size PxQ?
def covManners(N, M):
    """NxM floor, 1x2 brick
    """
    # defensive precaution
    if ((N * M) % 2 != 0):
        return (0)
    
    # boundary
    if ((N = 1 and M  2) or
        (N  2 and M = 1) or
        (N = 0) or (M = 0)):
        return (0)
    
    if ((N == 1 and M == 2) or
        (N == 2 and M == 1)):
        return (1)
    
    # recursion
    retval = (
            covManners(N, M-2) +
            covManners(N-1, M) -
            covManners(N-1, M-2)
            ) + (
            covManners(N, M-1) +
            covManners(N-2, M) -
            covManners(N-2, M-1)
            )
    
    return (retval)
def covMannersGeneral(N, M, p, q):
    """NxM floor, PxQ brick
    """   
    # defensive precaution
    if (p = 0 or q = 0):
        return (0)
    if ((N * M) % (p * q) != 0):
        return (0)
    
    # boundary
    if ((N = p and M  q) or
        (N  q and M = p) or
        (N = 0) or (M = 0)):
        return (0)
    
    if ((N == p and M == q) or
        (N == q and M == p)):
        return (1)
    
    # recursion
    retval = (
            covMannersGeneral(N, M-q, p, q) +
            covMannersGeneral(N-p, M, p, q) -
            covMannersGeneral(N-p, M-q, p, q)
            ) + (
            covMannersGeneral(N, M-p, p, q) +
            covMannersGeneral(N-q, M, p, q) -
            covMannersGeneral(N-q, M-p, p, q)
            )
    
    return (retval)
def main():
    # test
    p, q = 1, 2
    for n in range(-5, 9):
        for m in range(-5, 9):
            assert covManners(n, m) == covMannersGeneral(n, m, p, q)
            print "%+d x %+d floor, %+d x %+d brick: %d" %(n, m, p, q,
                                                    covManners(n, m))
    
    p, q = 2, 3
    for n in range(-5, 9):
        for m in range(-5, 9):
            print "%+d x %+d floor, %+d x %+d brick: %d" %(n, m, p, q,
                            covMannersGeneral(n, m, p, q))
            
if __name__ == '__main__':
    main()


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/270/showart_1275341.html

论坛徽章:
0
2 [报告]
发表于 2008-12-02 15:20 |只看该作者

支持一个

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP