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 编码处理-str与Unicode的区别
Sep 06 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python使用functools实现注解同步方法
Feb 06 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python实现猜单词游戏
May 22 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
Flask处理Web表单的实现方法
Jan 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集成FCK的函数代码
2008/09/27 PHP
php跨服务器访问方法小结
2015/05/12 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
用js做一个小游戏平台 (一)
2009/12/29 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
Angular 4.x中表单Reactive Forms详解
2017/04/25 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
Python实现数据库并行读取和写入实例
2017/06/09 Python
python数据结构之链表详解
2017/09/12 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
施工人员岗位职责
2013/12/12 职场文书
户外婚礼策划方案
2014/02/08 职场文书
改革共识倡议书
2014/08/29 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
Matlab如何实现矩阵复制扩充
2021/06/02 Python
Python利用capstone实现反汇编
2022/04/06 Python