Harigami
ログイン
anonymous タイトルなし
No License Python
コピー
import numpy as np
import time

def input_sudoku():
    L=[]
    for i in range(9):
        L.append([int(x) for x in input().split()])
    print(L)


def check(a):
    for x in range(9):
        for y in range(9):
            i=a[y][x]
            if i not in (row(a,y) | col(a,x) | sq(a,x,y)):
                return x,y
    return True

def row(a,n):
    return set(a[n])

def col(a,n):
    return set(a[:,n])

def sq(a,x,y):
    if y<=2:
        k=a[:3]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]
    elif y<=5:
        k=a[3:6]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]
    else:
        k=a[6:9]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]

    return set(k.flatten())

def print_if_progress(a,mx):#埋けれた数が増えた時のみその時の進捗を出力
    filled=np.count_nonzero(a!=0)
    if filled>mx:
        mx=filled
        print(mx)
        print(a)
    return mx


def dfs(a,mx):#mxの因数は出力用/なくても動く
    if np.min(a)!=0:
        return a
    space=np.argmin(a)#左上から左へ、下へと見ていき、最小値(==空白 : 0以外が最小値の時は、上のif文でreturn)のindex(スカラ)を返す
    x=space%9  #x座標
    y=space//9 #y座標
    for i in range(1,10):
        if i not in (row(a,y) | col(a,x) | sq(a,x,y)):
            a[y][x]=i

            mx=print_if_progress(a,mx)#出力/なくても動く
    
            r=dfs(a,mx)
            if r.shape[0]:
                return r
            
    a[y][x]=0
    
    return np.array([])

def main():
    L=[]
    for i in range(9):
        L.append([int(x) for x in input().split()])
   
    a=np.array(L)

    if a.shape!=(9,9):
        print('入力値エラー:各行半角スペース区切りで9つの数字が入っていることを確認してください')
        return

    start=time.time()
    
    result=dfs(a,0)
        
    print(time.time()-start,"sec")
    print('---------------------')

    if result.shape[0]:
        for row in result:
            print(" ".join([str(x) for x in row.tolist()]))
    else:
        print('有効な解がありません')


if __name__ == '__main__':
    main()
import numpy as np
import time

def input_sudoku():
    L=[]
    for i in range(9):
        L.append([int(x) for x in input().split()])
    print(L)


def check(a):
    for x in range(9):
        for y in range(9):
            i=a[y][x]
            if i not in (row(a,y) | col(a,x) | sq(a,x,y)):
                return x,y
    return True

def row(a,n):
    return set(a[n])

def col(a,n):
    return set(a[:,n])

def sq(a,x,y):
    if y<=2:
        k=a[:3]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]
    elif y<=5:
        k=a[3:6]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]
    else:
        k=a[6:9]
        if x<=2:
            k=k[:,:3]
        elif x<=5:
            k=k[:,3:6]
        else:
            k=k[:,6:9]

    return set(k.flatten())

def print_if_progress(a,mx):#埋けれた数が増えた時のみその時の進捗を出力
    filled=np.count_nonzero(a!=0)
    if filled>mx:
        mx=filled
        print(mx)
        print(a)
    return mx


def dfs(a,mx):#mxの因数は出力用/なくても動く
    if np.min(a)!=0:
        return a
    space=np.argmin(a)#左上から左へ、下へと見ていき、最小値(==空白 : 0以外が最小値の時は、上のif文でreturn)のindex(スカラ)を返す
    x=space%9  #x座標
    y=space//9 #y座標
    for i in range(1,10):
        if i not in (row(a,y) | col(a,x) | sq(a,x,y)):
            a[y][x]=i

            mx=print_if_progress(a,mx)#出力/なくても動く
    
            r=dfs(a,mx)
            if r.shape[0]:
                return r
            
    a[y][x]=0
    
    return np.array([])

def main():
    L=[]
    for i in range(9):
        L.append([int(x) for x in input().split()])
   
    a=np.array(L)

    if a.shape!=(9,9):
        print('入力値エラー:各行半角スペース区切りで9つの数字が入っていることを確認してください')
        return

    start=time.time()
    
    result=dfs(a,0)
        
    print(time.time()-start,"sec")
    print('---------------------')

    if result.shape[0]:
        for row in result:
            print(" ".join([str(x) for x in row.tolist()]))
    else:
        print('有効な解がありません')


if __name__ == '__main__':
    main()
コンソール
現在、コメントはありません。
最初のコメンターになりませんか?