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实现给字典添加条目的方法
Sep 25 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
Python冲顶大会 快来答题!
Jan 17 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
简单了解python高阶函数map/reduce
Jun 28 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
python实现画出e指数函数的图像
Nov 21 Python
python离线安装外部依赖包的实现
Feb 13 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
python 实现的车牌识别项目
Jan 25 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 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操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jquery获取节点名称
2015/04/26 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
手机端转换rem适应
2017/04/01 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
python静态方法实例
2015/01/14 Python
python插入排序算法实例分析
2015/07/03 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
高校十八大报告感想
2014/01/27 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
安全生产月演讲稿
2014/05/09 职场文书
环保项目建议书
2014/08/26 职场文书
实习指导老师意见
2015/06/04 职场文书
《叶问2》观后感
2015/06/15 职场文书