棋盤問題,遞迴。

2021-06-23 05:59:08 字數 1440 閱讀 5913

將乙個8*8的棋盤進行如下分割: 

將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形, 

再將剩下的部分繼續如此分割, 這樣割了(n-1)次後, 

連同最後剩下的矩形棋盤共有n塊矩形棋盤. 

(每次切割都只能沿著棋盤格仔的邊進行) 

允許的分割方案 2 

不允許的分割方案 原棋盤上每一格有乙個分值, 

一塊矩形棋盤的總分為其所含各格分值之和

現在需要把棋盤按上述規則分割成 n 塊矩形棋盤, 

並使各矩形棋盤總分的均方差最小 

均方差 , 其中平均值 , 

xi 為第 i 塊矩形棋盤的總分 

請程式設計對給出的棋盤及 n, 求出 σ 的最小值 

第1行為乙個整數n (1 < n < 15)

第2行至第9行每行為8個小於100的非負整數, 表示棋盤上

相應格仔的分值 

每行相鄰兩數之間用乙個空格分隔 

輸出 僅乙個數, 為σ (四捨五入精確到小數點後三位) 

4 樣例輸入 

3 1 1 1 1 1 1 1 3 

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 1 

1 1 1 1 1 1 1 0 

1 1 1 1 1 1 0 3 

樣例輸出 

這個題和以前做過的挑戰程式設計裡面的分棒子差不多,都是遞迴的解決問題,不算很難。

#include

#include

using namespace std;

const int maxnum = 9;

double getresult(int n,int x1,int y1,int x2,int y2);

int tmpresult[15][maxnum][maxnum][maxnum][maxnum];

int board[maxnum][maxnum];

int gradesum[maxnum][maxnum];

int calsum(int x1,int y1,int x2,int y2);

int main()

}double result = n*getresult(n,1,1,8,8)-gradesum[8][8]*gradesum[8][8]; 

cout}double getresult(int n,int x1,int y1,int x2,int y2)

for(vertical = x1;vertical < x2;line++)

for(line = y1;line < y2;line++)

tmpresult[n][x1][y1][x2][y2] = minnum;

return minnum;

}

A 棋盤問題

在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將在乙個n n...

A 棋盤問題

在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,用乙個空格隔開,表示了將...

遞迴 回溯 馬踏棋盤問題

將馬隨機放在西洋棋的board 0 n 1 0 n 1 的某個方格中,馬按走棋規則進行移動。走遍棋盤上全部n n個方格。編制遞迴程式,求出馬的行走路線,並按求出的行走路線,將數字1,2,n n依次填入乙個n n的方陣,輸出之。輸入 棋盤的大小n n 10 馬的初始位置 i,j 1 i n,1 j n...