-->

a016: 數獨(SUDOKU)

内容 :

數獨是一種源自18世紀末的瑞士數學家歐拉(Leonhard Euler)所創造的拉丁方塊游戲。
在9格寬×9格高的大九宮格中有9個3格寬×3格高的小九宮格,已經有一些數字在裡面了(但並非一定採用數字,例如採用字母a,b,c...),根據這些數字,運用你的邏輯和推理,在其他的空格上填入1到9的數字,但是要注意了,每個數字在每個小九宮格內不能重複,每個數字在每行、每列也不能出現一樣的數字。 這種遊戲只需要邏輯思維能力,與數字運算無關。雖然玩法簡單,但數字排列方式卻千變萬化,所以不少教育者認為數獨是鍛鍊腦筋的好方法。
現在我們可以用程式來判斷一個九宮格數字是不是一個數獨的正解。

输入说明 : 

輸入的每一組測試資料均為 9 × 9 的矩陣,且全部為 1~9 的數字,每兩組九宮格之間以一空行作為分隔

输出说明 : 

yes or no

Python:

while True :
    print('开始输入数独')
    m = [[0 for x in range(9)] for y in range(9)]
    x = 0
    y = 0
    while x < 9 :
        print('第{0}行'.format(x + 1))
        while y < 9 :
            a = input()
            try :
                int(a)
            except :
                print('不是整数哦')
            else :
                a = int(a)
                if 0 < a < 10 :
                    m[x][y] = a
                    y += 1
                else :
                    print('数字格式不符')
        y = 0
        x += 1
    for x in range(9) :
        print(m[x])
    test = [0 for x in range(9)]
    flag = 0
    for y in range(9) :
        if flag == 1 : break
        for x in range(9) :
            test[x] = m[y][x]
        test.sort()
        for z in range(9) :
            if not test[z] == z + 1 :
                print('NO1')
                flag = 1
                break
    else :
        for v in range(3) :
            if flag == 1 : break
            for x in range(3) :
                if flag == 1 : break
                u = 0
                for y in range(3) :
                    for z in range(3) :
                        test[u] = m[z + 3 * x][y + 3 * v]
                        u += 1
                test.sort()
                for t in range(9) :
                    if not test[t] == t + 1 :
                        print(test)
                        print('NO2')
                        flag = 1
                        break
        else :
            print('YES')