擴充套件:這個問題我認為是多陣列組合問題。
《多個陣列,每個陣列中選擇一項,總共能有多少種組合,reduce函式實現》
《多個陣列,每個陣列中選擇一項,總共能有多少種組合,treelib實現》
通過**算出來,並沒有遍歷全部路徑
import numpy as np
import copy
#這個函式的作用是多個陣列,每個陣列中取乙個數字,最多能有多少種組合方式。
def getallpossiblemap(mlist):
h = len(mlist)
w = 1
for l in mlist:
w = w * len(l)
print('getallpossiblemap : ', h, w)
mat = np.zeros((h, w), dtype=np.int8)
for i in range(h):
for j in range(w):
step = w // (pow(len(mlist[i]), i) * len(mlist[i]))
mat[i, j] = mlist[i][(j // step) % len(mlist[i])]
return mat
def printmat(mat):
print('----------------------', end=' ')
h = 9; w = 9
for i in range(h):
if i % 3 == 0 and i != 0:
print('\n---------------------')
else:
print()
for j in range(w):
if j % 3 == 0 and j != 0:
print('|', end=' '); print(mat[i, j], end=' ')
else:
print(mat[i, j], end=' ')
print('\n----------------------')
def isvalue(mat):
h, w = mat.shape
for i in range(h):
for j in range(w):
iteams = list(set(iteams))
if 0 in iteams:
return false
if len(iteams) != 9:
return false
return true
def easyfindnumbers(mat):
h, w = mat.shape
lastmat = np.zeros(mat.shape, mat.dtype)
while not (lastmat == mat).all():
lastmat = mat.copy()
for i in range(h):
for j in range(w):
if mat[i, j] == 0:
iteams = list(set(iteams))
if 0 in iteams:
iteams.remove(0)
if len(iteams) == 8 and sum(iteams) != 45:
#print(i, j)
#print(iteams, len(iteams), sum(iteams))
mat[i, j] = 45 - sum(iteams)
return lastmat
def possibilitynumber(mainmat, n):
possibles =
coordinates =
(h, w) = mainmat.shape
for i in range(h):
for j in range(w):
if mainmat[i, j] == 0:
iteams = list(set(iteams))
if 0 in iteams:
iteams.remove(0)
if len(iteams) == 9 - n:
fullnumber = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).tolist()
for it in iteams:
if it in fullnumber:
fullnumber.remove(it)
#print(i, j, fullnumber)
return coordinates, possibles
strlist =
strlist2 =
index = 0
def calallway(possibles):
waylist =
tmpwaylist=
for line in possibles:
if len(waylist) == 0:
for item in line:
else:
for wline in waylist:
for item in line:
waylist = copy.deepcopy(tmpwaylist)
tmpwaylist.clear()
print('waylist : ', waylist)
return waylist
def main():
#初始化數獨矩陣
h = 9; w = 9
mainmat = np.zeros((h,w), dtype=np.int8)
mainmat[0, 1] = 7; mainmat[0, 5] = 5; mainmat[0, 7] = 9
mainmat[1, 0] = 4; mainmat[1, 5] = 6; mainmat[1, 8] = 7
mainmat[2, 3] = 8; mainmat[2, 5] = 2
mainmat[3, 0] = 2; mainmat[3, 1] = 8; mainmat[3, 2] = 6; mainmat[3, 6] = 4
mainmat[5, 2] = 9; mainmat[5, 6] = 1; mainmat[5, 7] = 7; mainmat[5, 8] = 8
mainmat[6, 3] = 4; mainmat[6, 5] = 1
mainmat[7, 0] = 3; mainmat[7, 3] = 6
mainmat[7, 8] = 5
mainmat[8, 1] = 4; mainmat[8, 3] = 3; mainmat[8, 7] = 2
printmat(mainmat)
#將容易計算出來的位置進行計算
mainmat = easyfindnumbers(mainmat)
printmat(mainmat)
#計算乙個格仔裡可能存在的數字。
coordinates2, possibles2 = possibilitynumber(mainmat, 2)
print('coordinates2 : ', coordinates2, '\npossibles2 : ', possibles2)
coordinates3, possibles3 = possibilitynumber(mainmat, 3)
print('coordinates3 : ', coordinates3, '\npossibles3 : ', possibles3)
#由於電腦性限制,有3個可能性的我只新增了3個。
for i in range(3):
print('coordinates : ', coordinates2, '\npossibles : ', possibles2)
#計算所有的路徑了
allway = calallway(possibles2.copy())
#測試所有的路徑
for index in range(len(allway)):
tmat = np.copy(mainmat)
line = allway[index]
#print(line)
for index2 in range(len(coordinates2)):
tmat[coordinates2[index2][0], coordinates2[index2][1]] = line[index2]
#檢測路徑是否正確
ttmap = easyfindnumbers(tmat)
if isvalue(ttmap):
printmat(ttmap)
if __name__ == '__main__':
main()
有意思的面試題
1.10個箱子,每個箱子10個蘋果,其中乙個箱子的蘋果是9兩 個,其他的都是1斤 個。要求利用乙個秤,只秤一次,找出那個裝9兩 個的箱子。1,他們都是很聰明的人 2,他們的原則是先求保命,再去多殺人 3,100顆不必都分完 4,若有重複的情況,則也算最大或最小,一併處死 3.現在北京有一套房子,20...
幾個有意思的面試題
1,abcdx9 dcba 因為9乘a不進製所以a只能是1 9乘d得個位是1所以d只能是9 同樣9乘b也不能進製只有1和0,1已屬a所以b只能是0 9乘9進8要想第二位為0,乘9的個位上必須是2,c就只有8了 所以abcd 1089 2,一艘輪船從甲港順水航行到乙港,立即逆水返回甲港。共用8小時。已...
說幾道有意思的面試題
很長時間沒有寫部落格,突然想起來現在的公司的面試題。選了比較有意思的幾道題,寫一篇部落格談一談。祖傳 的重構 題目描述 現在有乙個函式add 裡面 很複雜實現了一系列的功能。不能不去重構他會波及太大,所以不能改函式裡面的 但新需求是要知道在 呼叫了這個函式,這個函式被呼叫了多少次 count 和被例...