알고리즘/search

[백준]2580 스도쿠

씩씩한 IT블로그 2020. 6. 10. 20:59
반응형

1.풀이

(1) L[r][c]==0인 숫자를 찾아서 1~9까지 중 넣을 수 있는 숫자를 넣는다

(2) num을 한칸 더가서 dfs를 돈다

(3) 다돌고 난 후엔 해당 위치 L[r][c]를 다시 0으로 돌려놓는다

2.소스코드

(1) sys.exit()으로 종료

import sys
L=[]
for i in range(9):
    L.append(list(map(int,input().split())))

#행, 열, 구역 검사
def cheak(L,r,c,num):
    #행검사
    if num in L[r]:
        return False
    #열검사
    for i in range(9):
        if L[i][c]==num:
            return False
    #영역검사
    dR = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
    dC = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
    centorR=3*(r//3)+1
    centorC=3*(c//3)+1
    for k in range(9):
        tempR=centorR+dR[k]
        tempC=centorC+dC[k]
        if L[tempR][tempC]==num:
            return False
    return True

def dfs(num,L):
    if num==81:
        for i in range(9):
            print(*L[i])
        sys.exit()

    r=num//9
    c=num%9
    if L[r][c]!=0:
        dfs(num+1,L)
    else:
        for i in range(1,10):
            if cheak(L,r,c,i):
                L[r][c] = i
                dfs(num+1,L)
        L[r][c]=0

dfs(0,L)

 

(2) 연속적 True반환으로 종료

import sys
L=[]
for i in range(9):
    L.append(list(map(int,input().split())))

#행, 열, 구역 검사
def cheak(L,r,c,num):
    #행검사
    if num in L[r]:
        return False
    #열검사
    for i in range(9):
        if L[i][c]==num:
            return False
    #영역검사
    dR = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
    dC = [-1, 0, 1, -1, 0, 1, -1, 0, 1]
    centorR=3*(r//3)+1
    centorC=3*(c//3)+1
    for k in range(9):
        tempR=centorR+dR[k]
        tempC=centorC+dC[k]
        if L[tempR][tempC]==num:
            return False
    return True

def dfs(num,L):
    if num==81:
        for i in range(9):
            print(*L[i])
        return True

    r=num//9
    c=num%9
    if L[r][c]!=0:
        if dfs(num+1,L):
            return True
    else:
        for i in range(1,10):
            if cheak(L,r,c,i):
                L[r][c] = i
                if dfs(num+1,L):
                    return True
        L[r][c]=0
    return False

dfs(0,L)
반응형