首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python暴力解数独

别说话,复制

import time

class point():

def __init__(self, x, y):

self.x = x

self.y = y

self.available = []

self.value = 0

def rowNum(p, sudoku):

row = set(sudoku[p.y * 9:(p.y + 1) * 9])

row.remove(0)

return row # set type

def colNum(p, sudoku):

col = []

length = len(sudoku)

for i in range(p.x, length, 9):

col.append(sudoku[i])

col = set(col)

col.remove(0)

return col # set type

def blockNum(p, sudoku):

block_x = p.x // 3

block_y = p.y // 3

block = []

start = block_y * 3 * 9 + block_x * 3

for i in range(start, start + 3):

block.append(sudoku[i])

for i in range(start + 9, start + 9 + 3):

block.append(sudoku[i])

for i in range(start + 9 + 9, start + 9 + 9 + 3):

block.append(sudoku[i])

block = set(block)

block.remove(0)

return block # set type

def initPoint(sudoku):

pointList = []

length = len(sudoku)

for i in range(length):

if sudoku[i] == 0:

p = point(i % 9, i // 9)

for j in range(1, 10):

if j not in rowNum(p, sudoku) and j not in colNum(p, sudoku) and j not in blockNum(p, sudoku):

p.available.append(j)

pointList.append(p)

return pointList

def tryInsert(p, sudoku):

availNum = p.available

for v in availNum:

p.value = v

if check(p, sudoku):

sudoku[p.y * 9 + p.x] = p.value

if len(pointList)

t1 = time.time()

useTime = t1 - t0

showSudoku(sudoku)

print('\nuse Time: %f s' % (useTime))

exit()

p2 = pointList.pop()

tryInsert(p2, sudoku)

sudoku[p2.y * 9 + p2.x] = 0

sudoku[p.y * 9 + p.x] = 0

p2.value = 0

pointList.append(p2)

else:

pass

def check(p, sudoku):

if p.value == 0:

print('not assign value to point p!!')

return False

if p.value not in rowNum(p, sudoku) and p.value not in colNum(p, sudoku) and p.value not in blockNum(p, sudoku):

return True

else:

return False

def showSudoku(sudoku):

for j in range(9):

for i in range(9):

print('%d ' % (sudoku[j * 9 + i]), end='')

print('')

if __name__ == '__main__':

t0 = time.time()

sudoku = [

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,

]

pointList = initPoint(sudoku)

showSudoku(sudoku)

print('\n')

p = pointList.pop()

tryInsert(p, sudoku)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180406G1FIID00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券