首页 > 其他分享 >py: 数独

py: 数独

时间:2024-06-22 16:11:52浏览次数:16  
标签:already py np range set print 数独 msg

数独:9x9

编了一段代码,就是末尾那里,重复“刷”几次,就排好了。

# -*- coding: utf-8 -*-
#coding=utf-8
__author__ = 'bjhhh'

'''
数独
'''

import numpy as np
a = np.array([[0,0,1,0,0,0,6,7,9],
              [2,0,0,0,7,9,1,0,8],
              [0,0,9,1,3,8,0,0,5],
              [0,2,3,0,5,6,8,0,7],
              [4,5,0,0,9,0,0,0,0],
              [7,0,8,3,0,0,4,0,0],
              [0,0,0,7,6,0,9,8,4],
              [0,6,0,0,8,0,7,2,3],
              [0,3,0,0,2,0,0,0,1]
              ])
print (a)


print("+++"*60)
print("============a[]是原始数据,b[]是预估集合数据,c[]是结果")

set000 = set("123456789")
b = np.zeros([9,9],dtype=set)
#b = [[set000 for i in range(9)] for i in range(9)]
#b[1][3]={"2","4"}

# 把集合中的数字,全部转换为字符串
def set_num2str(arr1):
    already_set = set(arr1) - set([0])      #把本行已有默认值的数字,去掉0以后,做成一个集合,备用。
    already_set = [str(i) for i in already_set]
    already_set = set(already_set)
    return already_set

# 根据x,y坐标位置,判断是第几宫
def get9gong(x, y):
    msg = ""
    if x < 3:
        if y < 3:
            tmp = np.ravel(a[0:3, 0:3])
            msg="第1宫"
        elif y < 6:
            tmp = np.ravel(a[0:3, 3:6])
            msg="第2宫"
        else:
            tmp = np.ravel(a[0:3, 6:9])
            msg="第3宫"
    elif x < 6:
        if y < 3:
            tmp = np.ravel(a[3:6, 0:3])
            msg="第4宫"
        elif y < 6:
            tmp = np.ravel(a[3:6, 3:6])
            msg="第5宫"
        else:
            tmp = np.ravel(a[3:6, 6:9])
            msg="第6宫"
    else:
        if y < 3:
            tmp = np.ravel(a[6:9, 0:3])
            msg="第7宫"
        elif y < 6:
            tmp = np.ravel(a[6:9, 3:6])
            msg="第8宫"
        else:
            tmp = np.ravel(a[6:9, 6:9])
            msg="第9宫"
    #print(msg)
    return tmp
    pass


# 重复多筛几遍,把集合中多余部分剔除
def reflux(b):
    # 四、再筛横行
    print("+++"*60,"再筛横行")
    for x in range(9):
        already_set = set()
        for y in range(9):
            if len(b[x][y])==1:
                already_set.add("".join(b[x][y]))
        for y in range(9):
            if len(b[x][y]) > 1:
                b[x][y] = b[x][y]  & (set000- set(already_set))
                # print()
    print("+++"*60,"再筛纵行")
    # 五、遍历9个纵行
    for y in range(9):
        already_set = set()
        for x in range(9):
            if len(b[x][y])==1:
                already_set.add("".join(b[x][y]))
        for x in range(9):
            if len(b[x][y]) > 1:
                b[x][y] = b[x][y]  & (set000- set(already_set))

    # 六、遍历9宫
    print("+++"*60,"再筛9宫")
    for x in range(9):
        for y in range(9):
            ls9gong = get9gong(x, y)
            ls9gong = set_num2str(ls9gong)
            if len(b[x][y])==1:
                # 当前格子的集合、当前九宫格还没有的集合,取交集
                b[x][y] = b[x][y] & (set000- ls9gong)
    return b
    pass


print("+++"*60,"遍历9个横行")
# 一、遍历9个横行
for x in range(9):
    print("***" * 10, x)
    ls_x = a[x]
    already_set = set_num2str(a[x])

    for y in range(9):
        val = ls_x[y]
        # 从a给b赋值,默认值不是0的赋值。
        if val > 0:
            b[x][y] = set(str(val))
        # 从a给b赋值,是0的赋值。(先赋值12345679集合,再去除本行已有的集合)
        if val == 0:
            b[x][y] = set000 - already_set
print(b)


print("+++"*60,"遍历9个纵行")
# 二、遍历9个纵行
for y in range(9):
    print("***" * 10, y)
    ls_y = a[0:9,y]
    already_set = set_num2str(ls_y)
    for x in range(9):
        val = ls_y[x]
        # 从a给b赋值,是0的赋值。(先赋值12345679集合,再去除本行已有的集合)
        if val == 0:
            b[x][y] = b[x][y] - already_set
print(b)


# 三、遍历9宫
print("+++"*60,"遍历9宫")
for x in range(9):
    for y in range(9):
        ls9gong = get9gong(x, y)
        ls9gong = set_num2str(ls9gong)
        if a[x][y]==0:
            # 当前格子的集合、当前九宫格还没有的集合,取交集
            b[x][y] = b[x][y] & (set000- ls9gong)
        # print(b[x][y])

b=reflux(b)
b=reflux(b)
b=reflux(b)
b=reflux(b)
print(b)

...

标签:already,py,np,range,set,print,数独,msg
From: https://www.cnblogs.com/qq21270/p/18262433

相关文章

  • python新手开发一个物联网应用
    开发一个物联网(IoT)应用涉及多个方面,包括硬件选择、网络连接、数据传输、数据处理和用户界面。下面是一个简单的物联网应用示例,它使用Python语言和MQTT协议进行数据传输。硬件要求:RaspberryPi(或其他兼容的微控制器)温度传感器(例如DHT11)软件要求:Python3paho-mqtt(Python的......
  • Python 全栈系列256 异步任务与队列消息控制(填坑)
    说明每个创新都会伴随着一系列的改变。在使用celery进行异步任务后,产生的一个问题恰好也是因为异步产生的。内容1问题描述我有一个队列stream1,对应的worker1需要周期性的获取数据,对输入的数据进行模式识别后分流。worker1我设施为10秒运行一次。然后我就发现输出......
  • Python—学生信息管理系统
    用Python来实现学生信息管理系统学生信息管理系统(Python)简介:基本信息管理和学生成绩管理。基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,学生成绩管理模块的主要功能有统计课程最高分、最低分和平均分。一、功能模块:基本信息管理......
  • 参考Python官网学习Python
    参考Python官网学习PythonPython教程—Python3.12.4文档Python:Python解释器易于扩展,使用C或C++(或其他C能调用的语言)即可为Python扩展新功能和数据类型。Python也可用作定制软件中的扩展程序语言。-------------------------------------------------------------......
  • Python 潮流周刊#57:Python 该采用日历版本吗?
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,赠书5本,全文2200字。以下是本期......
  • JetBrains PyCharm 2024 mac/win版编程艺术,智慧新篇
    JetBrainsPyCharm2024是一款功能强大的Python集成开发环境(IDE),专为提升开发者的编程效率和体验而设计。这款IDE不仅继承了前代版本的优秀特性,还在多个方面进行了创新和改进,为Python开发者带来了全新的工作体验。JetBrainsPyCharm2024版获取PyCharm2024提供了丰富的代码编......
  • NumPy数组的合并
    NumPy数组的合并方法说明concatenate()沿现有维度合并hstack()沿现有维度水平合并vstack()沿现有维度垂直合并stack()沿新维度合并1.concatenate()np.concatenate((arr1,arr2),axis=n)importnumpyasnparr1=np.array([[1,2],[3,4]])arr2......
  • python3使用pyVmomi获取vCenter中虚拟机cpu/内存信息
    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。邮箱:[email protected]说明文章分享在Linux操作系统中安装python3环境,并通过pyVmomi获取vCenter中运行的虚拟机信息,最后把获取的虚拟机数据存储到数据库中。前三章为基础环境构建,第四章为脚本代码。环境软......
  • Python网络爬虫的实现,要想学编程,首先的把爬虫学好!
    爬虫实现1.爬虫初步实现(1)我们爬取中国化工市场机械网,以下为相关代码演示importrequestsfrombs4importBeautifulSoupres=requests.get(addresses[i])res.encoding='GB18030'#通过修改编码方式为GB18030,兼容网站编码(gb2312)#这里的'html.parser......
  • python: fucontion
     defsixteenFoo(k):"""十六進制:paramk::return:"""fstr=''ifk==10:fstr="A"elifk==11:fstr="B"elifk==12:fstr=&q......