找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1776|回复: 4

[求助] 求助大神如何写一个自动出数独的程序

0

主题

3

帖子

3

积分

贫民

积分
3
书之声 发表于 2019-7-24 18:33:07 | 显示全部楼层 |阅读模式
本帖最后由 书之声 于 2019-7-24 18:35 编辑

      各位大神,我想写一个自动出数独的游戏。我是新手,写程序是业余爱好。写的这个程序运用了列表的相关知识。下面是我写的程序代码:
  1. import random as r
  2. while True:
  3.     line = [[],[],[],[],[],[],[],[],[]]
  4.     column = [[],[],[],[],[],[],[],[],[]]
  5.     region = [[],[],[],[],[],[],[],[],[]]
  6.     f = False
  7.     h = False
  8.     for a in line:
  9.         for b in column:  
  10.             for i in range(18):
  11.                 e = r.randint(1,9)
  12.                 if e not in a or e not in b:
  13.                     a.append(e)
  14.                     b.append(e)
  15.                     x = b.index(e)//3*3 + a.index(e)//3
  16.                     c = region[x]
  17.                     if e not in c:
  18.                         c.append(e)
  19.                         h = True
  20.                     elif i==17:
  21.                         f = True
  22.                         a.remove(e)
  23.                         b.remove(e)
  24.                     else:
  25.                         a.remove(e)
  26.                         b.remove(e)
  27.                 if h:
  28.                     break
  29.             if f:
  30.                 break
  31.         if f:
  32.             break
  33.     if not f:
  34.         break
  35. for g in line:
  36.     print(g)
  37. h = input()
复制代码
      line为每一行的数字,column为每一列的数字,region为每一区域的数字。

      当第一次运行到三个range()函数时:a如图1,b如图2,c如图3。

      算出来是这个样子:
  1. [7, 6, 4, 8, 2, 5]
  2. [1, 3]
  3. [9, 2, 5]
  4. [8]
  5. [3]
  6. []
  7. [7]
  8. []
  9. []
复制代码

      本来应该是一行9个数字整整齐齐,而且不应该有相同的数字才对。
      求大神指点迷津!!!
回复

使用道具 举报

0

主题

3

帖子

3

积分

贫民

积分
3
书之声  楼主| 发表于 2019-7-24 18:36:59 | 显示全部楼层
mmm......
回复

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
谢沧行 发表于 2019-7-24 19:31:24 | 显示全部楼层
本帖最后由 谢沧行 于 2019-7-24 19:53 编辑

网上找了个例子
import random
import math

matrix = []

def get_random_unit():
    _num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    random.shuffle(_num_list)
    return _num_list


def print_grid(arr):
    for i in range(9):
        print(arr)


def get_row(row):
    row_arr = []
    for v in matrix[row]:
        if v == 0:
            continue
        row_arr.append(v)
    return row_arr


def get_col(col):
    col_arr = []
    for i in range(9):
        val = matrix[col]
        if val == 0:
            continue
        col_arr.append(matrix[col])
    return col_arr


def get_block(num):
    col_arr = []
    seq = num % 3
    col_end = 9 if seq == 0 else seq * 3
    row_end = int(math.ceil(num / 3) * 3)
    for i in range(row_end - 3, row_end):
        for j in range(col_end - 3, col_end):
            val = matrix[j]
            if val != 0:
                col_arr.append(matrix[j])
    return col_arr


def get_block_seq(row, col):
    col_seq = int(math.ceil((col + 0.1) / 3))
    row_seq = int(math.ceil((row + 0.1) / 3))
    return 3 * (row_seq - 1) + col_seq


def get_enable_arr(row, col):
    avail_arr = get_random_unit()
    seq = get_block_seq(row, col)
    block = get_block(seq)
    row = get_row(row)
    col = get_col(col)
    unable_arr = list(set(block + row + col))
    for v in unable_arr:
        if v in avail_arr:
            avail_arr.remove(v)
    return avail_arr


def main():
    can_num = {}
    count = 0
   
    for i in range(9):
        matrix.append([0] * 9)

    num_list = get_random_unit()
    for row in range(3):
        for col in range(3):
            matrix[row][col] = num_list.pop(0)

    num_list = get_random_unit()
    for row in range(3, 6):
        for col in range(3, 6):
            matrix[row][col] = num_list.pop(0)

    num_list = get_random_unit()
    for row in range(6, 9):
        for col in range(6, 9):
            matrix[row][col] = num_list.pop(0)

    box_list = []
    for row in range(9):
        for col in range(9):
            if matrix[row][col] == 0:
                box_list.append({'row': row, 'col': col})

    i = 0
    while i < len(box_list):
        count += 1
        position = box_list
        row = position['row']
        col = position['col']
        key = '%dx%d' % (row, col)
        if key in can_num:
            enable_arr = can_num[key]
        else:
            enable_arr = get_enable_arr(row, col)
            can_num[key] = enable_arr

        if len(enable_arr) <= 0:
            i -= 1
            if key in can_num:
                del (can_num[key])
            matrix[row][col] = 0
            continue
        else:
            matrix[row][col] = enable_arr.pop()
            i += 1

    print_grid(matrix)
    print(count)


if __name__ == "__main__":
    main()
[3, 7, 8, 4, 5, 6, 1, 2, 9]
[6, 2, 5, 9, 8, 1, 3, 7, 4]
[9, 4, 1, 7, 3, 2, 6, 5, 8]
[5, 9, 7, 6, 2, 8, 4, 3, 1]
[4, 1, 3, 5, 7, 9, 8, 6, 2]
[2, 8, 6, 1, 4, 3, 5, 9, 7]
[7, 5, 9, 3, 1, 4, 2, 8, 6]
[1, 3, 2, 8, 6, 7, 9, 4, 5]
[8, 6, 4, 2, 9, 5, 7, 1, 3]




回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

贫民

积分
3
书之声  楼主| 发表于 2019-8-23 09:16:45 | 显示全部楼层
大神,那请问我的程序错在哪里?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

贫民

积分
3
书之声  楼主| 发表于 2019-8-23 09:20:10 | 显示全部楼层
还有,大神,我运行你的程序之后这样子:
Traceback (most recent call last):
  File "L:/我的工具/5959959595.py", line 124, in <module>
    main()
  File "L:/我的工具/5959959595.py", line 100, in main
    row = position['row']
TypeError: list indices must be integers or slices, not str
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表