您现在的位置是:主页 > news > 嘉兴网站开发学校/英文网站设计公司
嘉兴网站开发学校/英文网站设计公司
admin2025/4/30 17:55:20【news】
简介嘉兴网站开发学校,英文网站设计公司,石家庄的疫情情况 最新消息,做网站要用到哪些架包python 解数独一、数独规则:\qquad数独共有九九八十一个小方格,要求每一行、每一列的小方格都包含数字1-9,且不能重复;将这个方格平均分成9个3 ∗*∗ 3的方格,每个方格的数字也必须包含1-9,且不能重复。二、解题思路\q…
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