用于解决数独问题的代码可以解决4个空格,然后却什么也不做

时间:2019-07-29 00:35:04

标签: python pandas

我创建了这个程序来解决整个数独难题。在测试时,我注意到它只应解决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)

0 个答案:

没有答案