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的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
Python实现随机选择元素功能
Sep 14 Python
python实现将读入的多维list转为一维list的方法
Jun 28 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
基于Python快速处理PDF表格数据
Jun 03 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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的ajax框架xajax入门与试用介绍
2010/12/19 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
介绍Python中的文档测试模块
2015/04/28 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
公司活动策划方案
2014/01/13 职场文书
大学新学期计划书
2014/04/28 职场文书
营销与策划实训报告
2014/11/05 职场文书
计算机实训报告总结
2014/11/05 职场文书
2015年党员自评材料
2014/12/17 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
小爸爸观后感
2015/06/15 职场文书
节水宣传标语口号
2015/12/26 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL