华为OD机试题:数独
生活随笔
收集整理的這篇文章主要介紹了
华为OD机试题:数独
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)獨是一個我們都非常熟悉的經(jīng)典游戲,運用計算機我們可以很快地解開數(shù)獨難題,現(xiàn)在有一些簡單的數(shù)獨題目,請編寫一個程序求解。
如有多解,輸出一個解
輸入描述:
輸入9行,每行為空格隔開的9個數(shù)字,為0的地方就是需要填充的。輸出描述:
輸出九行,每行九個空格隔開的數(shù)字,為解出的答案。 #解題想法:首先九宮格判斷規(guī)則,橫、豎、宮格內(nèi)數(shù)字不重復,所以有三種判斷方法,取交集看共享的是否 為一個,是一個就填寫,但由于存在多解(且此時交集為兩個元素),故增加試錯機制,當發(fā)現(xiàn)零點個數(shù)沒有 發(fā)生變化,便進行試驗,并記錄當前節(jié)點狀態(tài),后面如果發(fā)現(xiàn)零點的三種判斷方法沒有交集,便恢復狀態(tài), 并確認另外一個值是正確的import sys def heng(i, j, ll):n = []for m in range(0, 9):if ll[i][m] != 0:n.append(ll[i][m])return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n)) def shu(i, j, ll):n = []for m in range(0, 9):if ll[m][j] != 0:n.append(ll[m][j])return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n)) def gong(i, j, ll):m1 = i // 3m2 = j // 3n = []for a in range(m1 * 3, m1 * 3 + 3):for b in range(m2 * 3, m2 * 3 + 3):if ll[a][b] != 0 :n.append(ll[a][b])return list(set([1, 2, 3, 4, 5, 6, 7, 8, 9]) - set(n)) if __name__ == "__main__":# ll = [# [0, 0, 8, 7, 1, 9, 2, 4, 5],# [9, 0, 5, 2, 3, 4, 0, 8, 6],# [0, 7, 4, 8, 0, 6, 1, 0, 3],# [7, 0, 3, 0, 9, 2, 0, 0, 0],# [5, 0, 0, 0, 0, 0, 0, 0, 0],# [8, 6, 1, 4, 0, 3, 5, 2, 9],# [4, 0, 0, 0, 2, 0, 0, 0, 8],# [0, 0, 0, 0, 0, 0, 0, 7, 0],# [1, 0, 7, 0, 6, 8, 0, 5, 0],# ]while True:isCon = Truell = []for i in range(9):tp = sys.stdin.readline().strip()if not tp:isCon = Falsebreaktp =[int(i) for i in tp.split(' ')]ll.append(tp)if isCon ==False:breakdd=[]q=0r=0w=0for i in range(0, 9):for j in range(0, 9):if ll[i][j] == 0:dd.append([i,j])while len(dd)>0 :ko = len(dd)for r in dd:res = []i=r[0]j=r[1]h1 = heng(i, j, ll)s1 = shu(i, j, ll)g1 = gong(i, j, ll)for o in h1:if o in s1 and o in g1:res.append(o)if len(res) ==0:dd=dlll[q][r]=wdd.remove([i, j])continueif len(res) == 1:ll[i][j] = res[0]dd.remove([i,j])else:continueif ko== len(dd):res = []i = dd[0][0]j = dd[0][1]h1 = heng(i, j, ll)s1 = shu(i, j, ll)g1 = gong(i, j, ll)for o in h1:if o in s1 and o in g1:res.append(o)ll[i][j] = res[0]dl = dd.copy()q=ir=jw=res[1]dd.remove([i, j])for x in ll:x=list(map(str,x))y=" ".join(x)print(y)總結(jié)
以上是生活随笔為你收集整理的华为OD机试题:数独的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U-Net及其变体
- 下一篇: 基于JavaWeb的理发店管理系统