首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
●学霸心态统治了中国的大学 薛涌zz- -| 回首页 | 2006年索引 | - -●CNNIC成为反恶意软件协调工作组政策与标准组组长单位zz

●无聊的笔试题目:螺旋队列

                                      

这里有C的解答。我承认,我花的时间有些长——所以我不适合吃程序员的饭——但是我不认为笔试考这个有什么意义。

'''
如图:

 

7(-1,-1)

8(0,-1)

9(1,-1)

10(2,-1)

6(-1,0)

1(0,0)

2(1,0)

11(2,0)

5(-1,1)

4(0,1)

3(1,1)

12(2,1)

17(-2,2)

16(-1,2)

15(0,2)

14(1,2)

13(2,2)



设“1”的坐标为(0,0) “7”的坐标为(-1,-1)
编写一个小程序,使程序做到输入坐标(X,Y)之后
显示出相应的数字。
有人管这东西叫“螺旋队列”
'''


def _getxy(x,y):
  #根据坐标返回元素值
  #最里面的是第一圈坐标是(+/-1, +/-1),也就是说,没有0坐标
  if x<0 and -x>=abs(y) and -x!=y:  #left
    n=-x
    if y>0:
      return (2*n-2)**2+(n-y)
    else:
      return (2*n-2)**2+(n-y)-1
  elif y<0 and -y>=abs(x):      #up
    n=-y
    if x<0:
      return (2*n-2)**2+(2*n-1)+(x+n)
    else:
      return (2*n-2)**2+(2*n-1)+(x+n)-1
  elif x>0 and x>abs(y):      #right
    n=x
    if y<0:
      return (2*n-2)**2+(2*n-1)*2+(y+n)
    else:
      return (2*n-2)**2+(2*n-1)*2+(y+n)-1
  else:              #bottom
    n=y
    if x>0:
      return (2*n-2)**2+(2*n-1)*3+(n-x)
    else:
      return (2*n-2)**2+(2*n-1)*3+(n-x)-1

def getxy(x,y):
  #根据题目要求的坐标返回元素值,实际是对上面_getxy坐标的偏移
  #在1上建立坐标原点,7是(-1,-1)
  if x<1:
    x-=1
  if y<1:
    y-=1
  return _getxy(x,y)

if __name__=='__main__':
  
  N=5  #完整的圈数
  
  '''
  xrange=range(-N,N+1)
  xrange=filter(lambda e:e!=0, xrange)
  yrange=range(-N,N+1)
  yrange=filter(lambda e:e!=0, yrange)
  
  row=''
  for y in xrange:
    for x in yrange:
      row+='%3d(%-2d, %-2d)' % (_getxy(x,y), x ,y)
    print row
    row=''
  '''
  
  row=''
  for y in range(-3,4+1):
    for x in range(-3,4+1):
      row+='%3d(%-2d, %-2d)' % (getxy(x,y), x ,y)
    print row
    row=''

  #下面输出到html文件
  htm_head='''<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="GENERATOR" content="getxy.py">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>无聊的笔试题目</title>
</head>

<body>

<table border="1">'''

  htm_tail='''
</table>

</body>

</html>
'''  
  xy=r'''<td>
  <p align="center" text-align:center"><font color="%s">%3d<sub>(%-i,%-i)</sub></font></p>
  </td>'''

  f=open('getxy.htm','w')
  print >>f, htm_head
  row=''
  for y in range(-N,N+1):
    print>>f, '<tr>\n'
    for x in range(-N,N+1):
      tx, ty=x, y
      if tx<1:
        tx-=1
      if ty<1:
        ty-=1
      if max(abs(tx),abs(ty)) % 2:
        color=''
      else:
        color='#FF0000'
      print >>f, xy % (color, getxy(x,y), x ,y)
    print>>f, '</tr>\n'

  print >>f, htm_tail
  f.close()

【作者: 冰冻牡蛎】【访问统计:】【2006年11月1日 星期三 11:17】【注册】【打印

搜索

Google

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=5816608

回复

- 评论人:对联横批   2007-10-13 16:31:41   

谭浩强那本C语言的练习册里就有这题...

验证码:   
评论内容: