有意思的面試題 數獨問題

2021-09-28 17:43:29 字數 4469 閱讀 6559

擴充套件:這個問題我認為是多陣列組合問題。

《多個陣列,每個陣列中選擇一項,總共能有多少種組合,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 和被例...