鱼C论坛

 找回密码
 立即注册
查看: 2122|回复: 0

[技术交流] python小练习(099):etch-a-scetch(三)

[复制链接]
发表于 2017-5-10 21:51:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
接上一期的python小练习

有了之前的那些函数以后,主程序就相对好写了。
不断交替进行横行和纵行的运算,剔除不可行的候选排列,最终剩下的就是答案。

完整程序:
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue May  9 20:57:18 2017

  4. @author: XuJ06
  5. """

  6. def getdata(file):
  7.     f = open(file)
  8.     flag = -1
  9.     size = []
  10.     hor = []
  11.     ver = []
  12.     temp = [size,hor,ver]
  13.     for i in f.readlines():
  14.         if i[0]=='#':
  15.             flag+=1
  16.         elif i[0]=='\n':
  17.             pass
  18.         else:
  19.             temp[flag].append([int(e) for e in i.split()])
  20.     return (size[0][0],size[0][1],hor,ver)

  21. def candidate(num,maxlen):
  22.     '''''针对给出的排列方式,递归获得所有的备选排列 点亮为# '''
  23.     candi = []
  24.     for i in range(maxlen+2-sum(num)-len(num)):
  25.         cans = '_'*i + '@'*num[0]
  26.         if len(num)==1:
  27.             tail = '_'*(maxlen-len(cans))
  28.             candi.append(cans+tail)
  29.         else:
  30.             tail = ['_'+j for j in candidate(num[1:], maxlen-len(cans)-1)]
  31.             candi.extend([cans + j for j in tail])
  32.     return candi

  33. def findinit(x,y,hnum,vnum):
  34.     '''''找出每一行和每一列的备选排列'''
  35.     candidateH = []
  36.     candidateV = []
  37.     for i in range(y):
  38.         candidateH.append(candidate(hnum[i],x))
  39.     for i in range(x):
  40.         candidateV.append(candidate(vnum[i],y))
  41.     return candidateH, candidateV

  42. def check(candi,pos,flag):
  43.     '''''对某一行(列)在给定位置和给定状态选择不冲突的备选方案'''
  44.     newcandi = []
  45.     for i in candi:
  46.         if i[pos]== flag:
  47.             newcandi.append(i)
  48.     return newcandi

  49. def solver(file):
  50.     xsize,ysize,hnum,vnum = getdata(file)
  51.     candiH, candiV = findinit(xsize,ysize,hnum,vnum)
  52.     result = []
  53.     for i in range(xsize):
  54.         result.append([' ' for j in range(ysize)])
  55.     count = 0
  56.     target = xsize*ysize
  57.     while count < target:
  58.         for index in range(xsize):#先针对每一行
  59.             i = candiH[index]
  60.             if i == 'done':
  61.                 continue
  62.             elif len(i) == 1:
  63.                 for j in range(ysize):
  64.                     if result[index][j] == ' ':
  65.                         count+=1
  66.                         result[index][j] = i[0][j]
  67.                         candiV[j] = check(candiV[j],index,i[0][j])
  68.                 i = 'done'
  69.             else:
  70.                 for j in range(ysize):
  71.                     if result[index][j] != ' ':
  72.                         continue
  73.                     for k in i[1::]:
  74.                         if k[j]!=i[0][j]:
  75.                             break
  76.                     else:
  77.                         result[index][j] = i[0][j]
  78.                         count+=1
  79.                         candiV[j] = check(candiV[j],index,i[0][j])

  80.         for index in range(ysize):#再针对每一列,除个别变量外,代码相同
  81.             i = candiV[index]
  82.             if i == 'done':
  83.                 continue
  84.             elif len(i) == 1:
  85.                 for j in range(xsize):
  86.                     if result[j][index] == ' ':
  87.                         count+=1
  88.                         result[j][index] = i[0][j]
  89.                         candiH[j] = check(candiH[j],index,i[0][j])
  90.                 i = 'done'
  91.             else:
  92.                 for j in range(xsize):
  93.                     if result[j][index] != ' ':
  94.                         continue
  95.                     for k in i[1::]:
  96.                         if k[j]!=i[0][j]:
  97.                             break
  98.                     else:
  99.                         result[j][index] = i[0][j]
  100.                         count+=1
  101.                         candiH[j] = check(candiH[j],index,i[0][j])
  102.     for line in result:
  103.         print(''.join(line))

  104. print(solver('up.txt'))
复制代码


输出:
  1. ___________________@@@_@@_______
  2. __________________@@@@@@@@______
  3. _________________@@@@@@@@@@_____
  4. _________________@@@___@__@_____
  5. _________________@@@@@_@@_@_____
  6. _________________@@@@@_@@_@_____
  7. ________________@@@@___@__@_____
  8. _____________@@@@@@@@@@@@@@@____
  9. ___________@@@@@@@@@@@@@@@@@@@__
  10. __________@@@@@@_@@@@@@@@@@@@@@_
  11. _________@@@@@@___@_@@@@@@@@@@@@
  12. _________@@@@@@_____@_@@@@@@@@@@
  13. ________@@@@@@@___@@__@_@@@@@@@@
  14. ________@@@@@@_@_@_@@___@_@_@__@
  15. ________@@@@@___@__@@@@________@
  16. ________@@@@@_@@@@_@_@@@@_@_@_@_
  17. ________@@@@@___@_@___@@@@@@@@__
  18. _________@@@@@_@@__@___@@@@@@@@_
  19. _________@@@@@@__@__@@___@_@@@__
  20. __________@@@@@@_@@@__@@_____@__
  21. ___________@@@@@@___@___@@@@@___
  22. @___________@@@@@@__@@@_________
  23. @@___________@@@@@@@___@@_______
  24. @@@__@@@___@@@@@@@@@@_@@@@______
  25. @@@@@@@@@_@@@@@@@@@@@@____@_____
  26. @@@@@@@@@@@@@@@@@@@@@@____@_____
  27. _@@@@@@@@@@@@@@@@@@@@@_@@@@_____
  28. __@__@@@@@@@@@@@@@@@@@____@_____
  29. ___@@__@@@@@@@@_@@@@@_____@_____
  30. ________@@_____@@_____@@@@______
  31. __________@@@@@__@@_@___@_______
  32. ___________________@@@@@________
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表