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测试驱动开发实例
Oct 08 Python
详解Python中的循环语句的用法
Apr 09 Python
Python中几种导入模块的方式总结
Apr 27 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Python中if有多个条件处理方法
Feb 26 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
python3让print输出不换行的方法
Aug 24 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 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
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
js里面的变量范围分享
2020/07/18 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
Python中的exec、eval使用实例
2014/09/23 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python实现飞机大战小游戏
2019/11/08 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Python中如何添加自定义模块
2020/06/09 Python
Keras搭建自编码器操作
2020/07/03 Python
详解Python 中的容器 collections
2020/08/17 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
高三历史教学反思
2014/01/09 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
运动会横幅标语
2014/06/17 职场文书