免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3528 | 回复: 5

<ChinaUnix第一届“C语言代码”开发大赛> 用Python试试看 [复制链接]

论坛徽章:
0
发表于 2009-02-06 18:31 |显示全部楼层
ChinaUnix置顶贴《挑战自我 ChinaUnix第一届“C语言代码”开发大赛! 》
http://bbs.chinaunix.net/thread-1362866-1-1.html
题目蛮有意思的,大家闲的话可以尝试用Python做做。。。



1.给定一个整数N,生成一个N*N的矩阵,矩阵中元素取值为1至N2,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。例如,当N=4时,矩阵中的内容如下:
1    2    3    4
12    13    14    5
11    16    15    6
10    9    8    7


2.给定n(3 &pound; n &pound; 50000)个闭区间[ai, bi](1 &pound; i &pound; n, ai,bi均为非负整数),将这些区间合并为不相交的闭区间。输入文件的第一行包含一个整数n,为区间的数目。以下有n行,每行各包括两个空格分隔的整数ai 和 bi,表示一个区间[ai, bi](0 &pound; ai &pound; bi &pound; 1000000)。计算结果写在标准输出上,各区间按照升序排列输出。每一行包含两个用空格分开的整数,分别描述一个区间的上下界。例如,对于下列输入数据:
5
5 6
1 4
10 10
6 9
8 10
输出为:
1 4
5 10


3.从标准输入中读入N(1<N<10000)行以换行符结束且长度不超过2048的字符串,并在输入结束后输出其中最长10行的输入序号、长度和内容。当有多行长度相等的最长行时,输出最先输入的行的信息。参考【例2-7】的讨论,分别使用不同的方法实现这一程序,比较各种方法的运行效率。


4.写出程序求解Hanoi双塔问题。从标准输入上读入正整数n(n < 12),在标准输出上输出盘子的移动动作。盘子的尺寸由1到n,输出数据格式为:
move <盘子编号> from <原位置> to <新位置>
其中<盘子编号>为<d>a或<d>b,其中<d>是一个小于等于n的正整数,在初始状态下尺寸相同的盘子中a盘在b盘之上,<原位置>和<新位置>均为字母ABC中的一个。例如,移动序列的第一个动作可能是move 1a from A to C。


5.从标准输入上读入一个由数字和四则运算符组成的后缀表达式,将其转换为中缀表达式。后缀表达式中的运算符不超过15个,数字可以是整数,也可以是带有小数部分的浮点数,数字和运算符之间由空格分隔。转换后的中缀表达式中不应出现不必要的括号和空格,且转换前后各运算数的出现顺序不变。例如,对于后缀表达式:
4  7  -  2.1  5  +  *  7.1  9  -  /
输出
(4-7)*(2.1+5)/(7.1-9)


6.有大、中、小三个酒桶,分别能装A斤、B斤和C斤酒,其中A、B、C均为整数,A=B+C,B>C>0,且A为偶数。现在大桶装满了酒,另外两个桶都空着。写程序求解用这三个桶将酒平分成为两份的操作序列。当无解时输出字符串“No”。


7. 读入一个不超过20000000个字符的正文文件,统计其中所有由字母组成的单词及其所在的行号。文件中各个单词之间以空白符或标点分隔,区分大小写。按单词的字典序在标准输出上输出统计结果,输出格式为<word>: <h1> <h2> … <hn>,每个单词一行,其中<word>是单词,<hn>是行号。行号之间由空格分隔,按升序排列,不得重复,即当一个单词在一行出现多次时,只输出该行号一次。


8. 写一个程序,列出环境变量PATH中包含的所有目录的路径名。注意,Unix/Linux上PATH中各个路径名之间的分隔符与Windows上的不同。使用条件编译,使你的程序可以适用于这两种系统。

论坛徽章:
0
发表于 2009-02-06 18:37 |显示全部楼层
在Perl版区也发过了?

论坛徽章:
0
发表于 2009-02-07 16:53 |显示全部楼层
原帖由 lujx 于 2009-2-6 18:37 发表
在Perl版区也发过了?


  确实。有兴趣的可以研究下下。

论坛徽章:
0
发表于 2009-02-08 11:07 |显示全部楼层

回复 #3 xiaoyu9805119 的帖子

嗯,有时间试试看。
好久没有试做过这类题目了。

论坛徽章:
0
发表于 2009-02-09 23:11 |显示全部楼层

第一题

def matrix(n):
   
    block = n - 1  # there are four block in one circle
   
    result = dict()
   
    row = 0
    col = 0
   
    number = 1
    while block >= 0:
        row = row + 1
        col = col + 1
        
        if block == 0 : result[(row,col)] = number # number in the center
            
        for direction in [(0,1),(1,0),(0,-1),(-1,0)]:  # [north,east,south,west], clockwise
            drow,dcol = direction
            for i in range(1,block + 1):
                result[(row,col)] = number
                row = row + drow
                col = col + dcol
                number = number + 1
   
   
        
        block = block - 2 # next block length
   
    return result        
   


n = 20
result = matrix(n)

for i in range(1,n+1):
    for j in range(1,n+1):        
        print str(result[(i,j)]).rjust( len(str(n*n))),
    print "\n"

论坛徽章:
0
发表于 2009-02-10 16:19 |显示全部楼层

回复 #5 Northland 的帖子

强,我试了你的代码成功!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP