再將剩下的棋盤繼續進行如上分割,這樣割(n-1)次,最後原棋盤被分割成n塊矩形棋盤;
注意:每次分割只能沿著棋盤格仔的邊進行分割
原棋盤每個格仔都有乙個分值,乙個矩形棋盤的總分,為所含各格分值之和;
其中,xi為第i塊矩形棋盤的總分
對給出的棋盤和n,使得矩形棋盤總分的均方差最小,並輸出
分析思路:
程式**:
# -*- coding: utf-8 -*-
"""created on mon mar 1cezcwa2 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,y程式設計客棧2)+a*a)
if twww.cppcns.comesult=n*fun(n,1,1,8,8)-sums[8][8]*sums[8][8]
print(math.sqrt(result/(n*n)))
結果顯示:
本文標題: python遞迴法解決棋盤分割問題
本文位址: /jiaoben/python/265810.html
遞迴 棋盤分割問題
language default 棋盤分割 time limit 1000ms memory limit 10000k total submissions 11819 accepted 4175 description 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩...
遞迴 遞迴法解決排列問題
方法1 程式大致結構 約定 pl len pl 為最終放置結果的陣列 len為陣列的長度 ele為參與排列的個元素出現的個數 i為pl中下標 假設參與排列的元素有abcd run ele,int i 注意 在遞迴塊內,不應對所傳入的引數進行改變 每個遞迴塊所得到的原始引數應保持一致。舉例 abcde...
遞迴法解決兔子問題
記得以前過相似問題,今天有同事問道,竟然不知所答,故寫篇文章以記之。一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那麼若干月以後可以繁殖多少對兔子?分析 月份 1 2 3 4 5 6 7 8 9 成兔 0 1 1 2 3 5 8 幼兔 1 0 1 ...