程式設計之美 第一章 1 16 24點遊戲

2021-07-04 06:29:41 字數 2067 閱讀 5533

/*

24點遊戲:

給玩家4張牌,每張牌的面值在1~13之間,允許其中有數值相同的牌。採用加減乘除,允許中間運算存在小數,並且可以使用括號,但每張牌只能使用一次,嘗試

構造表示式,使其運算結果為24.

輸入:n1,n2,n3,n4

輸出:若能得到運算結果為24,輸出對應表示式

輸入:11,8,3,5

輸出:(11-8)*(3+5)=24

解法1:

窮舉法,運算符號4種,每個數字使用一次

每個數只能使用一次,對4個數進行全排列,共有4!=24種,4個數的四則運算需要3個運算子,共有64種,總有有24*64 = 1536種

再考慮加括號情況:4個數加括號共有5種情形

(a (b (cd))),(a ((bc) d)),((ab) (cd)),( ( a (bc) ) d ),(((ab)c)d)

共有24 * 64 * 5 = 7680種,採用逆波蘭表示式,總數不變。

遞迴解法:

將給定的4個數放入陣列array中,將其作為引數穿入函式f中,

f(array)

foreach(從陣列中任取兩個數的組合)

}}解法2:

定義要計算的初始資料,放於集合a中,定義函式f(a)為對集合a中的元素進行所有可能的四則運算所得到的值,採用分治思想,先將a劃分為兩個子集a1和a-a1,

其中a1為a的非空真自己,分別計算a1和a-a1中的元素進行四則運算得到的結果集合,即f(a1)和f(a-a1),然後對f(a1)和f(a-a1)這兩個集合中的元素進行加減

乘除運算,最後得到的所有集合的並集就是f(a)。

分治:劃分,遞迴求解,合併

給定兩個多重集合a和b,定義兩個集合中的元素如下:

fork(a,b) = 並,(a,b)屬於a*b,假設a1中有n個元素,a2中有m個元素,那麼將有n*m個(a,b),而每對值需要進行6個計算,

fork(a1,a2) = 2*n*m個元素,需要去重。假設集合a中有n個元素,那麼集合a的所有非空真子集個數為2^n-2,則f(a)第一層遞推式中共有(2^n-2)/2個fork函式

可以用二進位制數來表示集合和子集,由於只有4個元素,可以採用4位的二進位制數來表示集合a及其真子集,設a,當且僅當ai在某乙個真子集中時,

該真子集所代表的二進位制數對應的第i位才為1,如a1 = 則1110表示a1,若a2 = ,那麼1001表示a2,所以a的真子集範圍為1到14(1到2^n-2),

再用乙個大小為2^n-1的陣列s來儲存f(i)(1<=i<=15),陣列s中的每乙個元素s[i]都是乙個集合(f(i)),其中s[2^n-1]即為集合a中的所有元素通過四則運算和加括號得到

的全部結果,通過檢查s[2^n-1],可得知某個輸入是否有解。

24game(array)//array為初始輸入集合

for(int i = 1 ; i < n ; i++)

;//先對每個只有乙個元素的真子集賦值,即為該元素本身

} for(int i = 1 ;i <= 2^n - 1 ; i++)//對每個i都代表著array的乙個真子集

check(s[2^n-1]);//檢查s[2^n-1]中是否有值為24的元素,並返回

}f(int i)//i的二進位制表示可代表著集合的乙個真子集

for(int x = 1 ; x < i ; i++)//只有小於i的x才可能稱為i的真子集

}}*/

#include #include #include #include #include using namespace std;

const double threshould = 1e-6;//浮點數的誤差值

const int cardsnumber = 4;

const int resultvalue = 24;

double number[cardsnumber];

string result[cardsnumber];

bool dot(int n)

if(dot(cardsnumber))

else }

int main(int argc,char* argv)

程式設計之美 第一章 1 12拈石遊戲分析

拈石遊戲分析 有n塊石頭和兩個玩家a和b,玩家a先將石頭分成若干堆,然後按照baba.的順序不斷輪流取石頭,能將剩下的石頭 一次取光的玩家獲勝。每次取石頭的時候,每個玩家只能從若干堆石頭中任選一堆,取這一堆石頭中任意數目 大於0 個石頭。問 玩家a要怎樣分配和取石頭才能保證自己有把握取勝?經分析得出...

程式設計之美 第一章 1 4 買書問題

買書問題 過程 接受輸入,對輸入按照從大到小排序 a,b,c,d,e 然後選取min,設定遞迴出口是全0 輸入 2 1 1 1 1 2 2 2 1 1 2 2 2 2 2 10 10 10 10 10 輸出 38.0 51.2 60.0 300.0 include include include i...

程式設計之美 第一章 1 5快速找出機器故障

快速找出機器故障 為了保證搜尋引擎的服務質量,我們需要保證每份資料都有多個備份 假設乙個機器僅儲存了乙個標號為id的記錄 假設id是小於10億的整數 假設每份資料儲存了兩個備份,這樣 就有兩個機器儲存了同樣的資料。1在某個時間,如果得到乙個資料檔案id的列表,是否能夠快速地找出這個表中僅出現一次的i...