当前位置: 首页 > news >正文

自动解单色数织程序(基于Python和Ortools)

思路

先根据提示数列出每行或每列的所有组合,然后在Ortools中组合约束AddAllowedAssignments(行/列,涂色组合),最后等它自己解出来就行了。
为了节省计算量,也可以先确定提示数较大的行列的所有组合的交集。鉴于刚运行起来就直接被Ortools秒了,那就暂时不用求交集了。

多色数织的解法同理,求出每行每列的组合约束即可被解出。区别是单色数线之间会有间隔,不同颜色的数线之间不需要间隔。

三维数织(如可爱解谜方块、立体绘图方块)和三维多色数织(立体绘图方块2)也同理,只不过多了一个维度。

代码

try: ortools  # 单色数织通解
except:
    !pip install ortools
from ortools.sat.python import cp_model

hints = "8,1 1,1 1 1 1,3 1 1 4,3 1 4,3 1 1 4,1 1 1,2 1 1,1 1 2,1 5,2 1,10,1 1 1 1,15,15;2,6 3,1 3 3 2,1 3 1 3,1 1 2,1 2 1 1 2,1 1 1 4,1 2 1 1 2,1 1 2,1 3 2 4,1 3 1 1 2,1 3 1 1 2,5 1 1 2,3 1 2,4 2"
hint = hints.split(';')
rowHints = [[int(n) for n in row.split(' ')] for row in hint[0].split(',')]
colHints = [[int(n) for n in col.split(' ')] for col in hint[1].split(',')]
I, J = len(rowHints), len(colHints)
print(I, J)
model = cp_model.CpModel()
A = [[model.NewBoolVar(f'A_{i}_{j}') for j in range(J)] for i in range(I)]
AT = [[A[j][i] for j in range(J)] for i in range(I)]

def nonogram_row(hints, N):
    ans, k = [], hints[0]
    if sum(hints) == 0:
        return []
    if len(hints) == 1:
        for i in range(N-k+1):
            ans.append([int(i <= j < i+k) for j in range(N)])
    else:
        for i in range(N-sum(hints)-len(hints)+2):
            ans0 = nonogram_row(hints[1:], N-i-k-1)
            for ans00 in ans0:
                ans.append([0]*i + [1]*k + [0] + ans00)
    return(ans)
#for row in nonogram_row([2, 7, 5], 20): print(''.join([" 图"[i] for i in row]))

for n in range(I):
    model.AddAllowedAssignments(A[n], nonogram_row(rowHints[n], J))
for n in range(J):
    model.AddAllowedAssignments(AT[n], nonogram_row(colHints[n], I))

solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE:
    print("解出来辣!\\(^∀^)/\n")
    for row in A:
        print(''.join([" 黑"[solver.Value(item)] for item in row]))
else: print("解不出来!(ŎдŎ;)")

输出

Looking in indexes: https://mirror.baidu.com/pypi/simple/, https://mirrors.aliyun.com/pypi/simple/
Requirement already satisfied: ortools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (9.5.2237)
Requirement already satisfied: protobuf>=4.21.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from ortools) (4.24.4)
Requirement already satisfied: absl-py>=0.13 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from ortools) (2.1.0)
Requirement already satisfied: numpy>=1.13.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from ortools) (1.19.5)

[notice] A new release of pip available: 22.1.2 -> 24.0
[notice] To update, run: pip install --upgrade pip
15 15
解出来辣!\(^^)/

   黑黑黑黑黑黑黑黑    
  黑        黑   
 黑   黑 黑    黑  
 黑黑黑 黑 黑 黑黑黑黑  
 黑黑黑  黑  黑黑黑黑  
 黑黑黑 黑 黑 黑黑黑黑  
 黑    黑     黑  
 黑黑      黑   黑 
  黑      黑   黑黑
  黑       黑黑黑黑黑
   黑黑         黑
     黑黑黑黑黑黑黑黑黑黑
 黑 黑  黑  黑     
黑黑黑黑黑黑黑黑黑黑黑黑黑黑黑
黑黑黑黑黑黑黑黑黑黑黑黑黑黑黑

相关文章:

  • 无人机的飞行路径规划之CH-PPO算法(思考)
  • 面试之《vue常见考题》
  • MySQL环境安装详细教程(Windows/macOS/Linux)
  • Spring 的三种注入方式?
  • 代码随想录刷题day42|(二叉树篇)二叉树的最小深度(递归)+完全二叉树结点个数
  • Java反射与动态代理:框架设计的基石
  • Spring WebFlux:响应式编程
  • 文字转语音chat-tts-ui
  • 分布式锁—Redisson的同步器组件
  • MySQL中 IN 到底走不走索引?
  • win10安装部署DB-gpt,坑多
  • mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境
  • 20天 - TCP 和 UDP 有什么区别?说说 TCP 的三次握手?TCP 是用来解决什么问题?
  • Python中很常用的100个函数整理
  • React基础之类组件
  • XSENS:科幻电影《Love me》使用动作捕捉技术将未来AI拟人化
  • STM32初始安装
  • 2019年蓝桥杯第十届CC++大学B组真题及代码
  • Python 机器学习小项目:手写数字识别(MNIST 数据集)
  • Neo4j 数据库备份
  • 《中华人民共和国经济史(1949—1978年)》教材出版发行
  • 国家统计局:消费对我国经济增长的拉动有望持续增长
  • 广西鹿寨一水文站“倒刺扶手”存安全隐患,官方通报处理情况
  • 被围观的“英之园”,谁建了潮汕天价违建?
  • 海昏侯博物馆展览上新,“西汉帝陵文化展”将持续展出3个月
  • 外企聊营商|武田制药:知识产权保护助创新药研发