这两天一直在研究数独,但是并没有研究透彻,由于时间的原因,暂时研究终止。期间一共写出了一个大方法,一个小方法。小方法还待优化。
注意一点:输入数据后,先执行一次"up"命令,更新一下每个棋盘格的可选数字,才可执行"m1"或"m2"的操作。
代码就如下所示:
class shuDu:
# 一道待解决的数独题
cBoard =[
[6,0,0,0,0,0,5,8,0],
[5,2,0,9,0,0,6,0,0],
[0,0,0,0,5,0,0,0,3],
[2,0,0,8,3,0,0,0,0],
[0,0,6,1,0,9,3,0,0],
[0,0,0,0,7,6,0,0,9],
[8,0,0,0,4,0,0,0,0],
[0,0,2,0,0,5,0,1,7],
[0,6,1,0,0,0,0,0,4]
]
check = {} #可用数字字典
def refresh(self):
print(self.cBoard)
print("Refresh over")
def show(self):
print("==========================")
for i in range(0,9):
for j in range(0,9):
num = ['-','-','-','-','-','-','-','-','-']
if((i,j) in self.check):
for x in range(len(self.check[(i,j)])):
num[x] = list(self.check[(i,j)])[x]
print(num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],end=" ")
if(j==2 or j==5): print(end=" ")
print("")
if(i==2 or i==5): print("")
print("==========================")
def change(self):
print("输入为“空”宫格的行和列以及替换值(\\退出):")
while(1):
row,column,value = input() #行
if(row == "/"):
return
row = eval(row)
column = eval(column)
value = eval(value)
self.cBoard[row][column] = value
print("Change over")
def dele(self):
row,column,value = input("输入要删除的数字:") #行
row = eval(row)
column = eval(column)
value = eval(value)
self.check[(row,column)].remove(value)
print("Change over")
def inputData(self):
print("Enter data:")
for index in range(9):
a,b,c,d,e,f,g,h,i = input()
self.cBoard[index] = [eval(a),eval(b),eval(c),eval(d),eval(e),eval(f),eval(g),eval(h),eval(i)]
print("Enter over")
def checkBoard(self):
for i in self.check:
print(i,self.check[i])
print("Print over")
def update(self):
self.check = {}
for row in range(0,9):
for column in range(0,9):
if(self.cBoard[row][column]==0): #找到一个为空的宫格
s = {1,2,3,4,5,6,7,8,9}
for i in range(9):
s.discard(self.cBoard[row][i]) # 移除集合中的元素,且如果元素不存在,不会发生错误
s.discard(self.cBoard[i][column])
if( row<3 and column<3): #i-row j->column 移除九宫格的元素
for i in range(0,3):
for j in range(0,3):
s.discard(self.cBoard[i][j])
elif( 3<=row<6 and column<3 ):
for i in range(3,6):
for j in range(0,3):
s.discard(self.cBoard[i][j])
elif ( 6<=row<9 and column<3 ):
for i in range(6,9):
for j in range(0,3):
s.discard(self.cBoard[i][j])
elif ( row<3 and 3<=column<6 ):
for i in range(0,3):
for j in range(3,6):
s.discard(self.cBoard[i][j])
elif ( 3<=row<6 and 3<=column<6):
for i in range(3,6):
for j in range(3,6):
s.discard(self.cBoard[i][j])
elif ( 6<=row<9 and 3<=column<6):
for i in range(6,9):
for j in range(3,6):
s.discard(self.cBoard[i][j])
elif ( row<3 and 6<=column<9):
for i in range(0,3):
for j in range(6,9):
s.discard(self.cBoard[i][j])
elif ( 3<=row<6 and 6<=column<9):
for i in range(3,6):
for j in range(6,9):
s.discard(self.cBoard[i][j])
elif ( 6<=row<9 and 6<=column<9 ):
for i in range(6,9):
for j in range(6,9):
s.discard(self.cBoard[i][j])
self.check[(row,column)]= s
def method1(self): #基础摒除法
print("==========================")
for i in self.check:
s = self.check[i]
if(len(s)==1):
self.cBoard[i[0]][i[1]] = list(s)[0]
self.update()
print(i,s)
print("Deal over")
print("==========================")
def method2(self): #互斥法
print("==========================")
for row in range(0,9): #行
for column in range(0,9):
if(self.cBoard[row][column]==0):
bads = set()
for j in range(0,9):
if(self.cBoard[row][j]==0 and j!= column ): #逻辑运算符出错
bads = bads.union(self.check[(row,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods,"row")
for column in range(0,9): #列
for row in range(0,9):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(0,9):
if(self.cBoard[i][column]==0 and i!= row ): #逻辑运算符出错
bads = bads.union(self.check[(i,column)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods,"column")
for row in range(0,3): #九宫格
for column in range(0,3):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(0,3):
for j in range(0,3):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(0,3):
for column in range(3,6):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(0,3):
for j in range(3,6):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(0,3):
for column in range(6,9):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(0,3):
for j in range(6,9):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(3,6):
for column in range(0,3):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(3,6):
for j in range(0,3):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(3,6):
for column in range(3,6):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(3,6):
for j in range(3,6):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(3,6):
for column in range(6,9):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(3,6):
for j in range(6,9):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(6,9):
for column in range(0,3):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(6,9):
for j in range(0,3):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(6,9):
for column in range(3,6):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(6,9):
for j in range(3,6):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
for row in range(6,9):
for column in range(6,9):
if(self.cBoard[row][column]==0):
bads = set()
for i in range(6,9):
for j in range(6,9):
if(self.cBoard[i][j]==0 and (i!= row or j!= column) ): #逻辑运算符出错
bads = bads.union(self.check[(i,j)]) # add set
goods = self.check[(row,column)].difference(bads)
if(len(goods)!=0):
self.cBoard[row][column] = list(goods)[0]
self.update()
print(row,column,goods)
print("Deal over")
print("==========================")
'''--------------------------------------------------------------------------------------'''
ex = shuDu()
while(1):
judge = input("-r打印棋盘 \
\n-c改变一个棋盘的值“123”将(1,2)改为3 \
\n-m1使用法则1处理 \
\n-ch打印空棋盘的可选数字 \
\n-m2使用法则2处理 \
\n-in输入数据“001020003” \
\n-up更新空棋盘的可选数字 \
\n-sh可选数字的方式打印棋盘 \
\n-de从可选数字中删除一个数字 “123” (1,2)中删除3 \
\n")
if(judge == "r"):
ex.refresh()
elif(judge =="c"):
ex.change()
elif(judge =="m1"):
ex.method1()
elif(judge =="ch"):
ex.checkBoard()
elif(judge == "m2"):
ex.method2()
elif(judge == "in"):
ex.inputData()
elif(judge == "up"):
ex.update()
elif(judge == "sh"):
ex.show()
elif(judge == "de"):
ex.dele()
else:
print("Enter error")
题中数据是一道正在解决的题目,下边是正在进行的研究进度:

下边是该题的答案:

等以后有时间和精力,再去研究吧,暂且搁置于此。