python递归法解决棋盘分割问题


Posted in Python onJuly 17, 2019

题目描述:将一个8*8的棋盘进行分割,将原棋盘分割下一个矩阵,同时确保剩下的棋盘也是矩阵;
再将剩下的棋盘继续进行如上分割,这样割(n-1)次,最后原棋盘被分割成n块矩形棋盘;
注意:每次分割只能沿着棋盘格子的边进行分割

原棋盘每个格子都有一个分值,一个矩形棋盘的总分,为所含各格分值之和;

其中,Xi为第i块矩形棋盘的总分

对给出的棋盘和n,使得矩形棋盘总分的均方差最小,并输出

python递归法解决棋盘分割问题

分析思路:

python递归法解决棋盘分割问题

程序代码:

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 12 09:55:35 2018
@author: lizihua
将一个8*8的棋盘进行分割,将原棋盘分割下一个矩阵,同时确保剩下的棋盘也是矩阵;
再将剩下的棋盘继续进行如上分割,这样割(n-1)次,最后原棋盘被分割成n块矩形棋盘;
注意:每次分割只能沿着棋盘格子的边进行分割
原棋盘每个格子都有一个分值,一个矩形棋盘的总分,为所含各格分值之和;
其中,Xi为第i块矩形棋盘的总分
对给出的棋盘和n,使得矩形棋盘总分的均方差最小,并输出
"""
 
import numpy as np
import math
 
n=int(input("请输入分割次数:"))
#每个格子的分值
s=np.zeros((8,8))
for i in range(8):
  s[i]=input("请输入第"+str(i)+"行各格的分值:").split(' ')
  #将line中的元素转换为整型
  s[i] = list(map(int, s[i]))
 
zero1=np.zeros(8)
zero2=np.zeros(9)
#向s中的最上面加入一行0
s=np.insert(s,0,values=zero1,axis=0)
#向s中的第一列加入一列0
s=np.insert(s,0,values=zero2,axis=1)
res=np.ones((15,8,8,8,8))*(-1) #fun的记录表
sums=np.zeros((9,9))       #(1,1)到(i,j)的矩形分值之和
res=np.ones((15,9,9,9,9))*(-1) #fun的记录表
sums=np.zeros((9,9))       #(1,1)到(i,j)的矩形分值之和
for i in range(1,9):
  #rowsum是列之和,所以当i变化时,rowsum要清零
  rowsum=0
  for j in range(1,9):
    
    rowsum+=s[i][j]
    sums[i][j]+=sums[i-1][j]+rowsum
 
print(sums)
 
#(x1,y1)到(x2,y2)的矩形分值之和
def calsum(x1,y1,x2,y2):
  return sums[x2][y2]-sums[x2][y1-1]-sums[x1-1][y2]+sums[x1-1][y1-1]
 
#定义递归函数fun()
def fun(n,x1,y1,x2,y2):
  #注意:MIN是局部变量,一定在函数里赋值,否则结果会有问题
  MIN=10000000
  if res[n][x1][y1][x2][y2] != -1:
    return res[n][x1][y1][x2][y2]
  if n==1:
    t=calsum(x1,y1,x2,y2)  #分割后的矩形棋盘(不再分割的那块)的总分
    res[n][x1][y1][x2][y2]=t*t   #Xi*Xi
    return t*t
  for i in range(x1,x2):
    a=calsum(x1,y1,i,y2)
    c=calsum(i+1,y1,x2,y2)
    t=min(fun(n-1,x1,y1,i,y2)+c*c,fun(n-1,i+1,y1,x2,y2)+a*a)
    if t<MIN:
      MIN=t
    
  for j in range(y1,y2):
    a=calsum(x1,y1,x2,j)
    c=calsum(x1,j+1,x2,y2)
    t=min(fun(n-1,x1,y1,x2,j)+c*c,fun(n-1,x1,j+1,x2,y2)+a*a)
    if t<MIN:
      MIN=t
  res[n][x1][y1][x2][y2]=MIN
  return MIN
 
 
result=n*fun(n,1,1,8,8)-sums[8][8]*sums[8][8]
print(math.sqrt(result/(n*n)))

结果显示:

python递归法解决棋盘分割问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
python requests post多层字典的方法
Dec 27 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
python的移位操作实现详解
Aug 21 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
信号生成及DFT的python实现方式
Feb 25 Python
Python os库常用操作代码汇总
Nov 03 Python
flask框架中的cookie和session使用
Jan 31 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
python的变量和简单数字类型详解
Sep 15 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 #Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 #Python
python递归法实现简易连连看小游戏
Mar 25 #Python
django2笔记之路由path语法的实现
Jul 17 #Python
Django之创建引擎索引报错及解决详解
Jul 17 #Python
python实现连连看辅助之图像识别延伸
Jul 17 #Python
Django 路由控制的实现
Jul 17 #Python
You might like
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
vue中本地静态图片路径写法
2018/03/06 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
python k-近邻算法实例分享
2014/06/11 Python
go语言计算两个时间的时间差方法
2015/03/13 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
python搭建微信公众平台
2016/02/09 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python多进程实现文件下载传输功能
2018/07/28 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python assert语句的简单使用示例
2019/07/28 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Python @property装饰器原理解析
2020/01/22 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
伦敦一卡通:The London Pass
2018/11/30 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
4s店销售经理岗位职责
2014/07/19 职场文书
学生会工作感言
2015/08/07 职场文书
2019年思想汇报
2019/06/20 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android
Python简易开发之制作计算器
2022/04/28 Python