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之Python文档
Oct 10 Python
python实现的文件同步服务器实例
Jun 02 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
python入门教程之识别验证码
Mar 04 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
对python 读取线的shp文件实例详解
Dec 22 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
Pytorch to(device)用法
Jan 08 Python
Python常用编译器原理及特点解析
Mar 23 Python
Django实现列表页商品数据返回教程
Apr 03 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
yolov5返回坐标的方法实例
Mar 17 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教程 基本语法
2009/10/23 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php统计文章排行示例
2014/03/04 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
PHP 文件上传限制问题
2019/09/01 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
手机银行营销方案
2014/03/14 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
发布会邀请函
2015/01/31 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis