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线程锁(thread)学习示例
Dec 04 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Python 3中的yield from语法详解
Jan 18 Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
Flask-Mail用法实例分析
Jul 21 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
python实现与redis交互操作详解
Apr 21 Python
Python matplotlib绘制雷达图
Apr 13 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php实现文件下载实例分享
2014/06/02 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
js数组的基本使用总结
2021/01/18 Javascript
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python中私有函数调用方法解密
2016/04/29 Python
python实现杨辉三角思路
2017/07/14 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python如何调用JS文件中的函数
2019/08/16 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
2013届毕业生求职信范文
2013/11/20 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP
Redis+AOP+自定义注解实现限流
2022/06/28 Redis