91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python遞歸法如何解決棋盤分割問題

發布時間:2021-08-04 10:38:18 來源:億速云 閱讀:146 作者:小新 欄目:開發技術

小編給大家分享一下python遞歸法如何解決棋盤分割問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

題目描述:將一個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遞歸法如何解決棋盤分割問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五台县| 大丰市| 青河县| 乌兰察布市| 鄂伦春自治旗| 博爱县| 五莲县| 昆山市| 镇宁| 会理县| 平邑县| 新晃| 屯昌县| 平乐县| 航空| 娄底市| 皋兰县| 阳东县| 沾益县| 张家口市| 渝北区| 酒泉市| 建平县| 岱山县| 清远市| 荔浦县| 新丰县| 老河口市| 湘阴县| 洛阳市| 广德县| 江山市| 密云县| 清水县| 灵川县| 盐城市| 安多县| 闸北区| 台北市| 安义县| 刚察县|