我创建了这个程序来解决整个数独难题。在测试时,我注意到它只应解决4个空间,而它还需要解决更多的问题。我相信错误是在if_len(item [“ value”])== 1的某处:check_values()函数中的块,但是我无法查明它。任何帮助或反馈将不胜感激
import pandas
df = pandas.read_csv("sudoku.csv")
df = df.set_index("ID")
print(df)
def get_rows(df):
rows = []
for row in range(1, 10):
rows.append(df.loc[row, :])
return rows
def get_columns(df):
columns = []
for column in range(1, 10):
columns.append(df.loc[:, "row" + str(column)])
return columns
def get_groups(df):
groups = []
for row in range(0, 3):
for column in range(0, 3):
groups.append(df.loc[1 + 3*row: 3 + 3*row, "row" + str(1 + 3*column): "row" + str(3 + 3*column)])
return groups
def find_group(item):
if item[0] <= 3:
if item[1] <= 3:
return 0
elif item[1] <= 6:
return 1
else:
return 2
elif item[0] <= 6:
if item[1] <= 3:
return 3
elif item[1] <= 6:
return 4
else:
return 5
else:
if item[1] <= 3:
return 6
elif item[1] <= 6:
return 7
else:
return 8
def find_unknowns(rows):
unknowns = []
for item in range(len(rows)):
for place in range(len(rows[item])):
if rows[item][place] == "_":
# print(num)
item_dict = {}
item_dict["row_num"] = item
item_dict["column_num"] = place
item_dict["group_num"] = find_group((item_dict["row_num"], item_dict["column_num"]))
#print(item_dict)
unknowns.append(item_dict)
return unknowns
#print("5" in groups[0].values)
def check_values(rows, columns, groups, unknowns, old_df):
for item in unknowns:
available_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
try:
available_nums = item["value"]
except KeyError:
item["value"] = available_nums
# print(item)
# print(available_nums)
# print(rows[item["row_num"]].values)
# print(columns[item["column_num"]].values)
# print(groups[item["group_num"]].values)
for value in rows[item["row_num"]].values:
try:
if int(value) in available_nums:
available_nums.remove(int(value))
except ValueError:
pass
for value in columns[item["column_num"]].values:
try:
if int(value) in available_nums:
available_nums.remove(int(value))
except ValueError:
pass
except TypeError:
pass
for num in available_nums:
if str(num) in groups[item["group_num"]].values:
available_nums.remove(num)
continue
item["value"] = available_nums
if len(item["value"]) == 1:
#print("READY")
first = item["row_num"] + 1
second = "row" + str(item["column_num"] + 1)
old_df.at[first, second] = item["value"][0]
unknowns.remove(item)
#print(item)
#print(available_nums)
return old_df
for i in range(10):
rows = get_rows(df)
columns = get_columns(df)
groups = get_groups(df)
if i == 0:
unknowns = find_unknowns(rows)
#print(unknowns)
df = check_values(rows, columns, groups, unknowns, df)