python递归法解决棋盘分割问题

  • 时间:
  • 浏览:26

标题问题描写:将1个8*8的棋盘停止朋分,将本棋盘朋分下1个矩阵,同时确保剩下的棋盘也是矩阵;
再将剩下的棋盘持续停止如上朋分,如许割(n⑴)次,最初本棋盘被朋分成n块矩形棋盘;
留意:每次朋分只能沿着棋盘格子的边停止朋分

本棋盘每一个格子皆有1个分值,1个矩形棋盘的总分,为所露各格分值之战;

此中,Xi为第i块矩形棋盘的总分

对给出的棋盘战n,使得矩形棋盘总分的均圆好最小,并输入

阐发思绪:

法式代码:

# -*- coding: utf⑻ -*-
"""
Created on Mon Mar 12 09:55:35 2018
@author: lizihua
将1个8*8的棋盘停止朋分,将本棋盘朋分下1个矩阵,同时确保剩下的棋盘也是矩阵;
再将剩下的棋盘持续停止如上朋分,如许割(n⑴)次,最初本棋盘被朋分成n块矩形棋盘;
留意:每次朋分只能沿着棋盘格子的边停止朋分
本棋盘每一个格子皆有1个分值,1个矩形棋盘的总分,为所露各格分值之战;
此中,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中的最下面参加1止0
s=np.insert(s,0,values=zero1,axis=0)
#背s中的第1列参加1列0
s=np.insert(s,0,values=zero2,axis=1)
res=np.ones((15,8,8,8,8))*(⑴) #fun的记载表
sums=np.zeros((9,9))       #(1,1)到(i,j)的矩形分值之战
res=np.ones((15,9,9,9,9))*(⑴) #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⑴][j]+rowsum
 
print(sums)
 
#(x1,y1)到(x2,y2)的矩形分值之战
def calsum(x1,y1,x2,y2):
  return sums[x2][y2]-sums[x2][y1⑴]-sums[x1⑴][y2]+sums[x1⑴][y1⑴]
 
#界说递回函数fun()
def fun(n,x1,y1,x2,y2):
  #留意:MIN是部分变量,1定正在函数里赋值,不然成果会有成绩
  MIN=10000000
  if res[n][x1][y1][x2][y2] != ⑴:
    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⑴,x1,y1,i,y2)+c*c,fun(n⑴,i+1,y1,x2,y2)+a*a)
    if t 

成果显现:

以上便是本文的全数内容,期望对各人的进修有所帮忙,也期望各人多多撑持剧本之家。