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 16 Python
介绍Python中的文档测试模块
Apr 28 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python日期的加减等操作的示例
Aug 15 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
深入浅析Python中的迭代器
Jun 04 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
Pycharm激活方法及详细教程(详细且实用)
May 12 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Python图片处理之图片裁剪教程
May 27 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实现快速排序法函数代码
2012/08/27 PHP
php检测文本的编码
2015/07/26 PHP
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
JS判断微信扫码的方法
2017/08/07 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
Django中使用group_by的方法
2015/05/26 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
党支部创先争优活动总结
2014/08/28 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
总经理年会致辞
2015/07/29 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
python 命令行传参方法总结
2021/05/25 Python
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL