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使用Socket(Https)Post登录百度的实现代码
May 18 Python
基于python编写的微博应用
Oct 17 Python
python实现查询IP地址所在地
Mar 29 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 Python
Django在win10下的安装并创建工程
Nov 20 Python
详解Python传入参数的几种方法
May 16 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
pandas DataFrame运算的实现
Jun 14 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 Python
Python在线和离线安装第三方库的方法
Oct 31 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命令注入攻击
2019/04/06 PHP
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
vue的mixins属性详解
2018/03/14 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
Python中字符串的处理技巧分享
2016/09/17 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
Python字典对象实现原理详解
2019/07/01 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
好的演讲稿开场白
2013/12/30 职场文书
初一家长会邀请函
2014/01/31 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
保安公司服务承诺书
2014/05/28 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
锦旗标语大全
2014/06/23 职场文书
教师节表彰会主持词
2015/07/06 职场文书
小学语文教学随笔
2015/08/14 职场文书