最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3.6數(shù)獨問題的解決

 更新時間:2019年01月21日 09:11:29   作者:Jayshon_Jaa  
這篇文章主要為大家詳細介紹了python3.6數(shù)獨問題的解決,具有一定的參考價值,感興趣的小伙伴們可以參考一下

算法比較暴力,直接用窮舉的方式一個一個去試,所以程序運行時間會比較長,運行時間視數(shù)獨而定。
不過從一開始到運行成功,整個過程卻是一波三折,設計算法就花了不少時間,然后就是不斷地去調(diào)試,找bug。剛開始的時候為了省事直接在sudoku類中遞歸調(diào)用blank,但是老哥還是too young too simple,sometimes navie,計算量實在是太大了,后面編譯器直接拋出 “RecursionError: maximum recursion depth exceeded while calling a Python object” 超過最大遞歸深度的錯誤。在把遞歸深度改到100000之后,又出現(xiàn)了堆棧溢出問題。當然,解決辦法也是相當?shù)乇┝Γ喊堰f歸放入while循環(huán)中,一旦符合條件就直接exit(0),整個程序直接gg,然后退出結(jié)束。
當然,算法還可以再優(yōu)化一下,可以不用那么暴力,先列出可能的值然后再填入,這樣可以大大縮小整個程序的運行時間,但是……懶得優(yōu)化了,就這樣吧,又不是不能用(笑~)。

運行結(jié)果:

再試一個其他的數(shù)獨:

這回就快得多了,11秒就完成了,比第一個數(shù)獨不知高到哪里去了

代碼如下所示:

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): # 調(diào)試
 for list in origin:
  print(list)
 print("\n")

 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()

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python網(wǎng)絡爬蟲 Scrapy中selenium用法詳解

    python網(wǎng)絡爬蟲 Scrapy中selenium用法詳解

    這篇文章主要介紹了python網(wǎng)絡爬蟲 Scrapy中selenium用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
    2019-09-09
  • Python入門教程(二十一)Python的數(shù)組

    Python入門教程(二十一)Python的數(shù)組

    這篇文章主要介紹了Python入門教程(二十一)Python的數(shù)組,數(shù)組是一種特殊變量,數(shù)組可以在單個名稱下保存多個值,我們可以通過引用索引號來訪問這些值,需要的朋友可以參考下
    2023-04-04
  • python中xrange用法分析

    python中xrange用法分析

    這篇文章主要介紹了python中xrange用法,實例分析了xrange的功能、作用以及與range在使用中的區(qū)別,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Python eval函數(shù)介紹及用法

    Python eval函數(shù)介紹及用法

    在本篇文章里小編給大家整理的是一篇關于Python eval函數(shù)介紹及用法,有興趣的朋友們可以參考下。
    2020-11-11
  • Python實現(xiàn)的基數(shù)排序算法原理與用法實例分析

    Python實現(xiàn)的基數(shù)排序算法原理與用法實例分析

    這篇文章主要介紹了Python實現(xiàn)的基數(shù)排序算法,簡單說明了基數(shù)排序的原理并結(jié)合實例形式分析了Python實現(xiàn)與使用基數(shù)排序的具體操作技巧,需要的朋友可以參考下
    2017-11-11
  • Python 使用 Bert 進行中文情感分析的方法

    Python 使用 Bert 進行中文情感分析的方法

    在自然語言處理(NLP)領域,情感分析是一個非常常見且重要的應用,本文將帶領新手使用 BERT 模型進行中文情感分析,并會詳細講解如何加載開源數(shù)據(jù)集、訓練模型、評估準確度,并最終導出模型供未來使用,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • maven沖突問題解決

    maven沖突問題解決

    這篇文章主要介紹了maven沖突問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python實現(xiàn)發(fā)送帶附件的郵件代碼分享

    python實現(xiàn)發(fā)送帶附件的郵件代碼分享

    在本篇文章里小編給大家整理的是關于python實現(xiàn)發(fā)送帶附件的郵件代碼分享內(nèi)容,需要的朋友們可以參考下。
    2020-09-09
  • Python3通過字符串訪問和修改局部變量的方法實例

    Python3通過字符串訪問和修改局部變量的方法實例

    最近在看python中nonlocal和global的使用,參考網(wǎng)上的大作,寫了點自己的心得,下面這篇文章主要給大家介紹了關于Python3通過字符串訪問和修改局部變量的相關資料,需要的朋友可以參考下
    2022-04-04
  • Pandas之ReIndex重新索引的實現(xiàn)

    Pandas之ReIndex重新索引的實現(xiàn)

    這篇文章主要介紹了Pandas之ReIndex重新索引的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06

最新評論

连江县| 哈尔滨市| 广州市| 兰溪市| 牡丹江市| 郑州市| 奈曼旗| 南乐县| 青川县| 甘德县| 涟源市| 新巴尔虎右旗| 特克斯县| 离岛区| 五大连池市| 印江| 微山县| 嵊泗县| 湖北省| 金山区| 凤山县| 阜阳市| 额尔古纳市| 桃源县| 东乌珠穆沁旗| 金堂县| 黄梅县| 华坪县| 绥棱县| 成武县| 岳池县| 清水河县| 砚山县| 盈江县| 柳河县| 镇宁| 富源县| 荥经县| 公安县| 濮阳市| 镇宁|