<ChinaUnix第一届“C语言代码”开发大赛> 用Python试试看

<ChinaUnix第一届“C语言代码”开发大赛> 用Python试试看

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 £ n £ 50000)个闭区间[ai, bi](1 £ i £ n, ai,bi均为非负整数),将这些区间合并为不相交的闭区间。输入文件的第一行包含一个整数n,为区间的数目。以下有n行,每行各包括两个空格分隔的整数ai 和 bi,表示一个区间[ai, bi](0 £ ai £ bi £ 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上的不同。使用条件编译,使你的程序可以适用于这两种系统。
在Perl版区也发过了?


QUOTE:
原帖由 lujx 于 2009-2-6 18:37 发表
在Perl版区也发过了?

  确实。有兴趣的可以研究下下。
嗯,有时间试试看。
好久没有试做过这类题目了。
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"
强,我试了你的代码成功!