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 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
python登陆asp网站页面的实现代码
Jan 14 Python
python实现定时同步本机与北京时间的方法
Mar 24 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
django框架auth模块用法实例详解
Dec 10 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
python批量生成条形码的示例
Oct 10 Python
使用Python开发冰球小游戏
Apr 30 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
实用函数3
2007/11/08 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
php类自动加载器实现方法
2015/07/28 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
Python变量作用范围实例分析
2015/07/07 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
关于反爬虫的一些简单总结
2017/12/13 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
Python调用飞书发送消息的示例
2020/11/10 Python
体育专业学生自我评价范文
2014/01/17 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
保护环境建议书300字
2014/05/13 职场文书
工程承诺书怎么写
2014/05/24 职场文书
志愿者宣传口号
2014/06/17 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL
Vue2.0搭建脚手架
2022/03/13 Vue.js