티스토리 뷰
https://www.acmicpc.net/problem/2580
문제
스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루어진 정사각형 판 위에서 이뤄지는데, 게임 시작 전 몇 몇 칸에는 1부터 9까지의 숫자 중 하나가 쓰여 있다.
나머지 빈 칸을 채우는 방식은 다음과 같다.
각각의 가로줄과 세로줄에는 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 굵은 선으로 구분되어 있는 3x3 정사각형 안에도 1부터 9까지의 숫자가 한 번씩만 나타나야 한다. 위의 예의 경우, 첫째 줄에는 1을 제외한 나머지 2부터 9까지의 숫자들이 이미 나타나 있으므로 첫째 줄 빈칸에는 1이 들어가야 한다.
또한 위쪽 가운데 위치한 3x3 정사각형의 경우에는 3을 제외한 나머지 숫자들이 이미 쓰여있으므로 가운데 빈 칸에는 3이 들어가야 한다.
이와 같이 빈 칸을 차례로 채워 가면 다음과 같은 최종 결과를 얻을 수 있다.
게임 시작 전 스도쿠 판에 쓰여 있는 숫자들의 정보가 주어질 때 모든 빈 칸이 채워진 최종 모습을 출력하는 프로그램을 작성하시오.
입력
아홉 줄에 걸쳐 한 줄에 9개씩 게임 시작 전 스도쿠판 각 줄에 쓰여 있는 숫자가 한 칸씩 띄워서 차례로 주어진다. 스도쿠 판의 빈 칸의 경우에는 0이 주어진다. 스도쿠 판을 규칙대로 채울 수 없는 경우의 입력은 주어지지 않는다.
출력
모든 빈 칸이 채워진 스도쿠 판의 최종 모습을 아홉줄에 걸쳐 한 줄에 9개씩 한 칸씩 띄워서 출력한다.
스도쿠 판을 채우는 방법이 여럿인 경우는 그 중 하나만을 출력한다
예제 입력 1
0 3 5 4 6 9 2 7 8
7 8 2 1 0 5 6 0 9
0 6 0 2 7 8 1 3 5
3 2 1 0 4 6 8 9 7
8 0 4 9 1 3 5 0 6
5 9 6 8 2 0 4 1 3
9 1 7 6 5 2 0 8 0
6 0 3 7 0 1 9 5 2
2 5 8 3 9 4 7 6 0
예제 출력 1
1 3 5 4 6 9 2 7 8
7 8 2 1 3 5 6 4 9
4 6 9 2 7 8 1 3 5
3 2 1 5 4 6 8 9 7
8 7 4 9 1 3 5 2 6
5 9 6 8 2 7 4 1 3
9 1 7 6 5 2 3 8 4
6 4 3 7 8 1 9 5 2
2 5 8 3 9 4 7 6 1
def exist(tmp_sdoku_map, x, y, val):
for i in range(9):
if(tmp_sdoku_map[x][i] == val):
return False
for i in range(9):
if(tmp_sdoku_map[i][y] == val):
return False
x, y = int(x/3), int(y/3)
for i in range(x*3, x*3 + 3):
for j in range(y*3, y*3 + 3):
if(tmp_sdoku_map[i][j] == val):
return False
return True
def go(tmp_sdoku_map, empty_map):
global totalCount
if(not empty_map) :
totalCount += 1
printMap(tmp_sdoku_map)
return
if(totalCount == 1):
return
x, y = empty_map.pop()
for i in range(1, 10):
if (exist(tmp_sdoku_map, x, y, i)):
tmp_sdoku_map[x][y] = i
go(tmp_sdoku_map, empty_map)
tmp_sdoku_map[x][y] = 0
empty_map.append((x,y))
def printMap(datas):
for i in range(9):
print(' '.join([str(x) for x in datas[i]]))
sdoku_map = []
# for i in range(9):
# sdoku_map.append(list(map(int, input().split(' '))))
sdoku_map = [
# [0,3,5,4,6,9,2,7,8],
# [7,8,2,1,0,5,6,0,9],
# [0,6,0,2,7,8,1,3,5],
# [3,2,1,0,4,6,8,9,7],
# [8,0,4,9,1,3,5,0,6],
# [5,9,6,8,2,0,4,1,3],
# [9,1,7,6,5,2,0,8,0],
# [6,0,3,7,0,1,9,5,2],
# [2,5,8,3,9,4,7,6,0]
# [2, 0, 0, 4, 0, 0, 1, 0, 0],
# [8, 6, 0, 1, 9, 0, 0, 0, 4],
# [0, 0, 1, 0, 3, 0, 0, 8, 9],
# [1, 0, 0, 0, 0, 0, 0, 5, 8],
# [9, 8, 0, 2, 0, 3, 0, 1, 7],
# [7, 5, 0, 0, 0, 0, 0, 0, 3],
# [6, 2, 0, 0, 8, 0, 3, 0, 0],
# [3, 0, 0, 0, 2, 9, 0, 4, 6],
# [0, 0, 9, 0, 0, 1, 0, 0, 2]
# [0,0,5,2,1,0,6,0,0],
# [6,7,0,0,0,0,1,0,4],
# [3,0,0,0,5,6,0,0,0 ],
# [5,6,0,0,0,0,2,0,7],
# [1,0,0,0,0,0,0,4,0 ],
# [0,0,0,5,0,0,0,3,0],
# [4,2,0,0,7,0,8,0,0 ],
# [0,0,6,0,4,0,0,7,0],
# [0,0,0,9,3,1,4,0,0 ]
# ]
# [0 , 0 , 0 , 0 , 0 , 0 , 0 , 7 , 1],
# [0 , 2 , 0 , 4 , 0 , 0 , 0 , 0 , 0],
# [6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0],
# [0 , 8 , 0 , 0 , 0 , 0 , 2 , 0 , 0 ],
# [0 , 0 , 0 , 0 , 3 , 7 , 0 , 0 , 0],
# [0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0],
# [0 , 0 , 0 , 2 , 0 , 0 , 5 , 4 , 0 ],
# [3 , 0 , 0 , 5 , 0 , 0 , 0 , 0 , 0],
# [1 , 0 , 9 , 0 , 0 , 0 , 0 , 0 , 0]
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,1,2,3,0,0,0],
[0,0,0,4,0,6,0,0,0],
[0,0,0,7,8,9,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0]
]
empty_store = []
totalCount = 0
for i in range(9):
for j in range(9):
if(sdoku_map[i][j] == 0):
empty_store.append((i,j))
empty_store = list(reversed(empty_store))
# print(empty_store)
go(sdoku_map, empty_store)
'알고리즘' 카테고리의 다른 글
[Dynamic Programming] 백준 피보나치 함수 1003 python3 풀이 (0) | 2020.01.30 |
---|---|
[BackTracking] 백준 연산자 끼워넣기 14888 python3 풀이 (0) | 2020.01.22 |
[BackTracking] 백준 NQueen 9663 python3 풀이 (0) | 2020.01.22 |
[BackTracking] 백준 N과M(2) 15650 python3 풀이 (0) | 2020.01.22 |
[BackTracking] 백준 N과M(1) 15649 python3 풀이 (0) | 2020.01.22 |
- Total
- Today
- Yesterday
- 엑셀
- Markdown Note
- 메모리제한
- nbconvert
- Open ID Connect
- Bruteforce
- type명령어
- unreachable object
- 동시설치
- 여러 파일 하나로 합치기
- minor GC
- ipynb
- anaconda2
- Python
- dynamic programming
- SecurityContextPersistenceFilter
- DP
- 이클립스메모리분석툴
- 스도쿠
- anaconda설치
- greedy
- Note App
- graph traversals
- 인쇄행고정
- SecurityContextRepository
- 인쇄열고정
- backtracking
- Divide&Conquer
- ICPC
- Excel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |