python 3.6 디지털 문제 해결
그러나 처음부터 운행 에 성공 하기 까지 전체 과정 은 우여곡절 이 많 았 고 디자인 알고리즘 은 많은 시간 을 들 였 다.그 다음 에 끊임없이 디 버 깅 을 하고 bug 를 찾 았 다.처음에 수 도 쿠 류 에서 빈 을 재 귀적 으로 호출 했 지만 형 은 too young too simple,sometimes navie 로 계 산 량 이 너무 많 았 습 니 다.뒤에 컴 파일 러 는'Recursion Error:maxim recursion depth exceeded while calling a Python object'를 직접 던 져 서 최대 재 귀적 깊이 를 초과 하 는 오 류 를 냈 습 니 다.재 귀 깊이 를 100000 으로 바 꾼 후에 또 스 택 넘 치 는 문제 가 발생 했다.물론 해결 방법 도 상당히 폭력 적 이다.while 순환 에 재 귀 를 넣 고 조건 에 맞 으 면 exit(0)를 직접 종료 하고 전체 프로그램 은 gg 를 직접 종료 한다.
물론 알고리즘 은 좀 더 최적화 할 수 있 습 니 다.그렇게 폭력 적 이지 않 고 가능 한 값 을 먼저 열거 한 다음 에 채 울 수 있 습 니 다.그러면 전체 프로그램의 운행 시간 을 크게 줄 일 수 있 습 니 다.하지만...최적화 하기 가 귀 찮 습 니 다.이렇게 하 세 요.못 쓰 는 것 도 아 닙 니 다(웃음~).
실행 결과:
다른 게임 을 다시 시도 합 니 다:
이번 에는 훨씬 빨 라 졌 다.11 초 만 에 완성 되 었 다.첫 번 째 게임 보다 어디 까지 높 았 는 지 모르겠다.
코드 는 다음 과 같다.
import copy
import time
t1=time.time()
origin = [[8, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 6, 0, 0, 0, 0, 0],
[0, 7, 0, 0, 9, 0, 2, 0, 0],
[0, 5, 0, 0, 0, 7, 0, 0, 0],
[0, 0, 0, 0, 4, 5, 7, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 3, 0],
[0, 0, 1, 0, 0, 0, 0, 6, 8],
[0, 0, 8, 5, 0, 0, 0, 1, 0],
[0, 9, 0, 0, 0, 0, 4, 0, 0]]
class sudoku:
def debug(self): #
for list in origin:
print(list)
print("
")
def check_repetition(self,list):# ,0
flag=0
for i in range(1,10):
if list.count(i)>=2:
return 1
else:
flag=flag+1
if flag==9:
return 0
def check_row(self,row):# , 0, 1
list = origin[row] #
r1 = self.check_repetition(list)
if r1 == 0:
return 0
else :
return 1
def check_column(self,column):# , 0, 1
list = [] #
for num in origin:
list.append(num[column])
r2 = self.check_repetition(list)
if r2==0:
return 0
else:
return 1
def check_square(self,x,y):# , 0, 1
x,y=y,x
if x>=9 or y>=9:
return
square = []#
for i in range(0+y//3*3, 3+y//3*3):
for j in range(0+x//3*3, 3+x//3*3):
square.append(origin[i][j])
r3 = self.check_repetition(square)
if r3==0:
return 0
else:
return 1
def check(self,x,y):# , 0, 0
r1 = self.check_row(x)
r2 = self.check_column(y)
r3 = self.check_square(x, y)
result=r1+r2+r3
return result
def get_next(self): # , row,column
i = 0
for list in origin:
try: # 0 ,
column = list.index(0)
row = origin.index(list)
res = (row, column)
return res
except ValueError:
i = i + 1
if i == 9:
t2=time.time()
print(" ={}".format(t2 - t1))
exit(0)
def poi(self,row, column): #
if row == 0 and column == -1:
return
if row == 8 and column == 9:
return
if column == -1:
column = 8
row = row - 1
if column == 9:
column = 0
row = row - 1
return (row, column)
def get_last(self,row, column):
origin[row].insert(column, 0)
origin[row].pop(column + 1)
column = column - 1 # 、
row, column = self.poi(row, column)#
r = origin[row][column] * compare[row][column]
while r != 0:
column = column - 1
row, column = self.poi(row, column)
r = origin[row][column] * compare[row][column]
return (row, column)
def blank(self):
try:
row,column=self.get_next()
except TypeError:#
exit(0)
j=0
flag=0
for i in range(1,10):
origin[row].insert(column,i)
origin[row].pop(column+1)
self.debug()
r = self.check(row, column)
if r==0:#
return
else:
j = j + 1
if j==9:
flag=1
break
if flag==1:
row, column = self.get_last(row, column)
value=origin[row][column]
self.debug()
while value == 9:
row, column = self.get_last(row, column)
value = origin[row][column]
self.debug()
while value<9:
for k in range(value+1,10):
origin[row].insert(column, k)
origin[row].pop(column + 1)
self.debug()
r=self.check(row,column)
if r!=0:#
if k==9:
row, column = self.get_last(row, column)
value=origin[row][column]
self.debug()
while value==9:
row, column = self.get_last(row, column)
value = origin[row][column]
self.debug()
break
else:
return
if __name__=="__main__":
compare = copy.deepcopy(origin)
sudoku = sudoku()
while 1:
sudoku.blank()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.