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()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기