用python解数独_python解数独

python 解数独

一、数独规则:

\qquad数独共有九九八十一个小方格,要求每一行、每一列的小方格都包含数字1-9,且不能重复;将这个方格平均分成9个3 ∗

*∗ 3的方格,每个方格的数字也必须包含1-9,且不能重复。

二、解题思路

\qquad 1、获取每一个空缺方格的坐标;

\qquad 2、遍历每一个空缺方格的坐标进行取可能的值,遍历从1-9进行取值。

\qquad(1)若满足数字不包含在空缺坐标的所在行和所在列以及3 ∗

*∗ 3方格内,则停止遍历,将该数字赋值于空缺坐标内;

\qquad(2)、若1-9都包含在空缺坐标的所在行和所在列以及3 ∗

*∗ 3方格内,则返回上一步,从比上一步的取值大1开始遍历取值。

三、代码

import pandas as pd

import time

class Sudoku():

def __init__(self,data):

self.data = data

# 获取空缺坐标

self.origin_list = [[i,j] for i in range(9) for j in range(9) if data.iloc[i,j]==0]

# 判断小格子属于哪个小正方形,并读取该小正方形的数据

def Check_in(self,i,j):

a = i//3

b = j//3

data = self.data.iloc[a*3:a*3+3,b*3:b*3+3]

data = data.values.flatten()

return data

# 判断小格子数字的值

def Check_Value(self,num,i,j):

for a in range(num,10):

if (a not in list(self.data.iloc[i,:]))&(a not in list(self.data.iloc[:,j]))&(a not in self.Check_in(i,j)) :

b=a

else:

b=0

if b!=0:

break

return b

# 返回上一步

def Come_Back(self,i):

i = i - 1

while True:

# 获取上一步的取值,并对取值进行加1

num = self.data.iloc[self.origin_list[i][0],self.origin_list[i][1]]+1

# 若上一步取值为9,则对上一步的格子赋值0,然后再往前退一步

if num >9:

self.data.iloc[self.origin_list[i][0],self.origin_list[i][1]] = 0

i= i-1

# 若返回上一步遍历后没有数值可取,则对上一步的格子赋值0,然后再返回上一步

elif self.Check_Value(num,self.origin_list[i][0],self.origin_list[i][1])==0:

self.data.iloc[self.origin_list[i][0], self.origin_list[i][1]] = 0

i = i - 1

# 若返回上一步遍历可以取得满足条件的值,则计算出该值,并退出循环

else:

a = self.Check_Value(num,self.origin_list[i][0],self.origin_list[i][1])

break

c = [a,i]

return c

# 判断每个格子的值

def Value_In(self):

i = 0

num = 1

while True:

# 对空缺值进行取值

a = self.Check_Value(num, self.origin_list[i][0], self.origin_list[i][1])

# 若该格子能取到满足条件的值,则对该格子进行赋值,并进入下一个空缺格子,取值函数的取值范围是0-9,则大于0即为满足条件

if a >0:

self.data.iloc[self.origin_list[i][0],self.origin_list[i][1]] = a

i+=1

# 若该格子无法取得满足条件的值,则返回上一步。

else:

c = self.Come_Back(i)

i = c[1]

self.data.iloc[self.origin_list[i][0],self.origin_list[i][1]] = c[0]

i=i+1

# 当所有空缺格子都填满了则退出循环

if i>=len(self.origin_list):

break

return

def main():

# 读取数据

data = pd.read_excel('./sudoku.xlsx', header = None, names = [str(i) for i in range(9)])

# 对空缺的数值赋值为0

data = data.fillna(0)

# 对所有的数据类型改为整数型

data = data.astype(int)

start = time.clock()

sudoku = Sudoku(data)

sudoku.Value_In()

end = time.clock()

print(sudoku.data)

print(end-start)

if __name__ == "__main__":

main()

原文链接:https://blog.csdn.net/vgrant/article/details/108974369

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值