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模拟登陆实现代码
Jun 14 Python
《Python学习手册》学习总结
Jan 17 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
python处理csv中的空值方法
Jun 22 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
python上传时包含boundary时的解决方法
Apr 08 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
python中添加模块导入路径的方法
Feb 03 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
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
React组件的三种写法总结
2017/01/12 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
python调用java的Webservice示例
2014/03/10 Python
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
群胜软件Java笔试题
2012/09/29 面试题
优秀员工获奖感言
2014/03/01 职场文书
物业消防安全责任书
2014/07/23 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android