python遞迴法解決棋盤分割問題

2022-10-04 17:06:15 字數 2181 閱讀 9165

再將剩下的棋盤繼續進行如上分割,這樣割(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 ...