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实现排序算法
Feb 14 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 Python
python 设置文件编码格式的实现方法
Dec 21 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
keras K.function获取某层的输出操作
Jun 29 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中is_file不能替代file_exists的理由
2014/03/04 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP 文件上传限制问题
2019/09/01 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Python中的装饰器用法详解
2015/01/14 Python
python创建和删除目录的方法
2015/04/29 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
党员批评与自我批评思想汇报
2014/10/08 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
考研导师推荐信范文
2015/03/27 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python
基于Redission的分布式锁实战
2022/08/14 Redis