|
|

楼主 |
发表于 2017-3-9 03:10
|
显示全部楼层
以下是这个填空问题的解的搜索程序:
- # List a - b
- def setMinus(a,b):
- c = []
- for j in a:
- if b.count(j) == 0:
- c.append(j)
- return c
- # 123 -> [1,2,3]
- def numToSet(n):
- r = n % 10
- s = [r]
- n = (n -r)/10
- while n > 0:
- r = n % 10
- n = (n-r)/10
- if s.count(r) == 0:
- s.insert(0,r)
- return s
- # List a inteset b
- def setCap(a,b):
- s = []
- if len(a) <= len(b):
- u,v = a,b
- else:
- u,v = b,a
- for j in u:
- if v.count(j) > 0:
- if s.count(j) == 0:
- s.append(j)
- return s
- # List a union b
- def setCup(a,b):
- s = list(a)
- for j in b:
- if s.count(j) == 0:
- s.append(j)
- return s
- def tryNine():
- w = [1,2,3,4,5,6,7,8,9]
- sol = []
- for m in w:
- if m > 8:
- break
- u = setMinus(w,[m])
- for a in u:
- v = setMinus(u,[a])
- if m*(10*a + v[0]) > 98:
- break
- for b in v:
- n = 10*a+b
- t = n*m
- if t > 98:
- # print "m,a,b =",[m,a,b]
- break
- mSet = setCup([m,a,b,],numToSet(t))
- if len(mSet) < 5:
- continue
- nSet = setMinus(w,mSet)
- for i in nSet:
- k = setMinus(nSet,[i])
- for j in k:
- sm = t + 10*i + j
- if sm > 98:
- # print "m,a,b,i,j = ",[m,a,b,i,j]
- break
- tmp = numToSet(sm)
- tp = setMinus(nSet,setCup([i,j],tmp))
- if len(tp) == 0:
- sol.append(setCup(setCup(mSet,[i,j]),tmp))
- c = len(sol)
- if c == 0:
- print "No solution found."
- elif c > 1:
- print "Multiple solutions found:"
- for sl in sol:
- print sl
- else:
- sl = sol[0]
- print "Solution is unique:"
- print "%5d" % (10*sl[1]+sl[2])
- print "x%4d" % sl[0]
- print "------"
- print "%5d" % (10*sl[3]+sl[4])
- print "+%4d" % (10*sl[5]+sl[6])
- print "------"
- print "%5d" % (10*sl[7]+sl[8])
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|