1. 程式人生 > >藍橋杯 牌型種數 (dfs)--------------------Five-菜鳥級

藍橋杯 牌型種數 (dfs)--------------------Five-菜鳥級

                                                 牌型種數

小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?

請填寫該整數,不要填寫任何多餘的內容或說明文字。

 

思路:比較簡單  用dfs  或則 13層for 迴圈 就好了 

一共是52張牌,不算花色的話就是13種類型,我用0~12來編號。 就想著 所有牌按順序排好等你去取

                                          0     1    2     3     4     5    6    7   8    9   10   11    12 

                                          0     1    2     3     4     5    6    7   8    9   10   11    12 

                                          0     1    2     3     4     5    6    7   8    9   10   11    12 

                                          0     1    2     3     4     5    6    7   8    9   10   11    12

  入口 (這裡開始,也就是第0層)

           然後開始拿 牌  拿牌 無非就是 拿 或者不拿 如果拿 你想拿幾張。

           當你在第num層的時候 你有 5 個選擇 拿0張 (不拿) 拿1張  拿2張 拿3張 拿4張

                                                                (當然這是在滿足一定條件下的,條件就是 你牌未拿滿13張 )

         

 看程式碼吧 有解釋  這就是暴力的dfs   結果:3598180

#include<stdio.h>
 int res=0;
 void dfs(int num,int count){
 // num 代表 取牌的數值 0~12 分別代表13張牌 count代表 你手中的牌  
 	   if(count>13||num>13)return;
		//退出條件 你拿到的牌超過了13張 或則 你拿到的牌的數值超過了13 
 	   if(count==13) res++;//在滿足條件的情況下 拿到牌剛好13 張 算一種方案  
 	   else{
 	       for(int i=0;i<=4;i++)
			// 每一個數值的牌你取到的可能情況有  0(沒取這個數值的牌)  1(取了一張) 2 3 4 
 	    	 dfs(num+1,count+i);
		  // num+1 這種情況 考慮完了 考慮下個數值的牌 count+i 你手上多了 i 張 數值為 num的牌 
 	    }
 	
 }
 int main()
 {
   dfs(0,0);// 剛開始 獲得了0張牌 
   printf("%d\n",res);
   return 0;
 }