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 相关文章推荐
Python3访问并下载网页内容的方法
Jul 28 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
python kafka 多线程消费者&amp;手动提交实例
Dec 21 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
python实现磁盘日志清理的示例
Nov 05 Python
python re的findall和finditer的区别详解
Nov 15 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
python 学习GCN图卷积神经网络
May 11 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
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
详解微信小程序 登录获取unionid
2017/06/27 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
js实现弹幕飞机效果
2020/08/27 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python的历史与优缺点整理
2020/05/26 Python
keras slice layer 层实现方式
2020/06/11 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
高中生期末评语大全
2014/01/28 职场文书
文明餐桌活动方案
2014/02/11 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers