撲克牌的順子
問題描述:從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2-10為數字本身,a為1,j為11,q為12,k為13,而大小王可以看成任意數字。
思路:可以將這5張牌排個序,然後統計出0的個數以及非0數字之間的間隔數,如果出現重複的非0數字,那麼不是順子。如果間隔數小於等於0的個數,那麼是順子。暫時未想到更好的辦法。
參考**:
//函式功能 : 從撲克牌中隨機抽5張牌,判斷是不是乙個順子
//函式引數 : pcards為牌,nlen為牌的張數
//返回值 : 是否順子
bool iscontinuous(int *pcards, int nlen)
//統計間隔數
int precard = pcards[i];
for(i = i + 1; i < nlen; i++)
return (zerocount >= capcount)? true: false; //只要王的個數大於間隔數
}n個骰子的點數
問題描述:把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。
思路:這是一道應用動態規劃思想的題目,而動態規劃最難的就是要找最優子結構。並採取一種稱為備忘錄的方法避免重複計算。因為備忘錄方法為每個解過的子問題建立了備忘錄,以備需要時參看,避免了相同子問題的重複求解。
本題的最優子結構為:f(k, n) 表示k個骰子點數和為n的種數,k表示骰子個數,n表示k個骰子的點數和
/ = f(k-1, n-6) + f(k-1, n-5) + f(k-1, n-4) + f(k程式設計客棧-1, n-3) + f(k-1, n-2) + f(k-1, n-1) 對於 k > 0, k <= n <= 6*k
f(k, n) =
\ = 0 對於 n < k or n > 6*k
當k=1時, f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1。
從上面公式可以看出,k個骰子點數和為n的種數只與k-1個骰子的和有關。這就可以用到備忘錄的方法,用一張**儲存已解決的子問題的解,然後自底向上填表。考慮到當前層的計算只與下一層有關,因此只需儲存一行。
參考**:
const int face_num = 6; //骰子的面數
//函式功能 : n個骰子的點數
//函式引數 : number為骰子數
//返回值 : 無
void printsumprobabilityofdices(int number)
} //不可能的情況,即i個骰子的和不可能小於i
for(j = i - 1;j >= 0; j--)
psum[j] = 0;
} //列印結果
for(i = 0; i <= size; i++)
cout
本文標題: 使用c語言求解撲克牌的順子及n個骰子的點數問題
本文位址:
撲克牌的順子
題目 從撲克牌中隨機抽 5張牌,判斷是不是乙個順子,即這 5張牌是不是連續的。2 10 為數字本身,a為 1,j為 11,q為 12,k為 13,而大小王可以看成任意數字。分析 這題目很有意思,是乙個典型的寓教於樂的題目。我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把 5張牌看成由 5...
撲克牌的順子
題目 從撲克牌中隨機抽5張牌 判斷是不是乙個順子 即這5張牌是不是連續的 2 10為數字本身 a為1 j為11 q為12 k為13 而大小王可以看成任意數字 思路 可以把5張牌看成由5個數字組成的陣列 大小王是特殊的數字 不妨把它定義為0 接下來就是怎麼判斷這5個數字是否連續 可以用排序的方法 由於...
撲克牌的順子
題目 從撲克牌中隨機抽取5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。方法 首先把陣列排序,再統計陣列中0的個數,最後統計排序之後的陣列中相鄰數字之間的空缺總數。如果空缺的總數小於或者等於0的個數,則這個陣列...