C演算法程式設計題(一)撲克牌發牌

2022-01-13 06:01:19 字數 4092 閱讀 5577

上週寫《我的程式設計開始(c)》這篇文章的時候,說過有時間的話會寫些演算法程式設計的題目,可能是這兩天週末過的太舒適了,忘記寫了。下班了,還沒回去,閒來無事就寫下吧。

因為寫c++的程式設計題和其他語言實現功能不一樣,要動腦子,寫筆記,思考整個的流程。就比如實現字串擷取,c#直接乙個substring搞定,c可能要用到指標來實現。當時參賽培訓的時候不知道死了多少的腦細胞,現在想想都後怕,但是前話都說了,得必須寫了。今天寫的這個撲克牌發牌的題目,是我在參賽培訓的時候練習的,記得當時寫了好長時間才搞出來,現在我看的話得看十幾分鐘才能回憶一些出來。希望寫的這些題目可以幫到開始學習演算法的同學,大牛請飄過!

廢話不多說,直接上題目。

程式描述:

一副紙牌有52張,4種花色,每種花色13張。我們能用乙個整數m就表示出所有的52種情況,規則是:

m / 13: =0: 紅心,=1: 方塊,=2: 梅花,=3: 黑桃

m % 13:  =0:2,=1:3,=2:4 ....  =8:10,=9:j,=10:q,=11: k,=12:a

比如:m = 15 就表示:方塊4  m=38表示:梅花a

我們希望用程式模擬1副撲克牌隨機抽取13張,發給某人的過程。

發牌後需要排序:規則是:先按花色,再按點數。花色的大小順序是:梅花、方塊、紅心、黑桃。點數的順序是:2、3、4、…. 10、j、q、k、a。

然後,挑選出最大的連續牌型。規則是:連續張數多的大。張數相等的則花色大的大(此時與點數無關)。

我們先分析下,上面的題目要求描述的很清楚了,我們要實現三個步驟:1,發牌(隨機)2,排序 3,輸出最大的連續牌型。

1,發牌

這個比較簡單,我直接貼下**:

1

int m,k=0

,i,j,l,t,x,y;

2int puke[4][13]=;

3int w[4]=;

4char point[13]=;

5srand(time(null));

6while(k<13)7

15 puke[x][y]=1

;16 printf("

%c",x+3

);17

if(y==8)18

21 printf("

%c "

,point[y]);

22 k++;

23 }

這裡我們用point陣列儲存點數,puke陣列的下標分別儲存花色和點數,值為1表示這張牌已經發了,x+3是花色的轉義字元。

2,排序

其實這個也好實現,因為我們儲存的發牌在puke陣列中,排序規則是先按花色,再按點數,這裡我們用笨方法,用四個for迴圈就可以實現,分別遍歷puke陣列。

示例**:

1

for(j=0;j<13;j++)

210 printf("

%c "

,point[j]);11}

12}13for(j=0;j<13;j++)

1422 printf("

%c "

,point[j]);23}

24}25for(j=0;j<13;j++)

2634 printf("

%c "

,point[j]);35}

36}37for(j=0;j<13;j++)

3846 printf("

%c "

,point[j]);47}

48 }

3,輸出最大的連續牌型

示例**:

1

int count[4]=;

2int index[4]=;

3int temp=0;

4for(i=0;i<4;i++)514

else

1521 temp=0;22

}23}24

}25 count[i]++;26}

2728

int max=0; 29

if(count[3]>max)

3034

for(i=0;i<3;i++)

3541}42

43int a=index[temp]-max;

44for(i=0;i)

4551 printf("

%c "

,point[a]);

5253 a++;

54 }

count陣列的意思是各個花色牌連續最大數,index陣列儲存的是開始各個花色連續的開始點數,就是point陣列的下標。

實現效果:

全部程式**:

1 #include "

stdio.h

"2 #include "

string.h

"3 #include "

time.h

"4 #include "

stdlib.h

"5 #include "

math.h"6

7void

main()8;

11int w[4]=;

12char point[13]=;

13srand(time(null));

14while(k<13)15

23 puke[x][y]=1

;24 printf("

%c",x+3

);25

if(y==8)26

29 printf("

%c "

,point[y]);

30 k++;31}

32 printf("

\n按任意鍵排序....");

33getchar();

3435

for(j=0;j<13;j++)

3644 printf("

%c "

,point[j]);45}

46}47for(j=0;j<13;j++)

4856 printf("

%c "

,point[j]);57}

58}59for(j=0;j<13;j++)

6068 printf("

%c "

,point[j]);69}

70}71for(j=0;j<13;j++)

7280 printf("

%c "

,point[j]);81}

82}83 printf("

\n按任意鍵輸出最大同花色連續牌....");

84getchar();

8586

int count[4]=;

87int index[4]=;

88int temp=0

;

89for(i=0;i<4;i++)

9099

else

100106 temp=0

;107

}108

}109

}110 count[i]++;

111}

112113

int max=0

;

114if(count[3]>max)

115119

for(i=0;i<3;i++)

120126

}127

128int a=index[temp]-max;

129for(i=0;i)

130136 printf("

%c "

,point[a]);

137138 a++;

139}

140 }

view code

當然這只是實現的一種方法,可能園友有更好的實現方法,歡迎指點。。。

C演算法程式設計題(一)撲克牌發牌

程式描述 一副紙牌有52張,4種花色,每種花色13張。我們能用乙個整數m就表示出所有的52種情況,規則是 m 13 0 紅心,1 方塊,2 梅花,3 黑桃 m 13 0 2,1 3,2 4 8 10,9 j,10 q,11 k,12 a 比如 m 15 就表示 方塊4 m 38表示 梅花a 我們希望...

洗牌 發牌演算法 打亂撲克牌順序

洗牌的演算法有很多,這裡主要介紹下幾種主要的演算法。方法一 每次找乙個隨機的位置,然後將這54個數放到找的位置中。步驟 1.用乙個整型陣列記錄各個位置是否已經放置了數,如果放置了則不為0,否則為0。所以在演算法開始的時候,初始化此陣列每個元素的值都為0.2.每次產生乙個0 53之間的數,看這個位置是...

撲克牌的隨機發牌程式

乙個撲克牌遊戲 準確的說就是 鬥地主 本來是打算取0 53的隨機數,取過的就做乙個標識,迴圈直至全部完。但是細想一下,效率實在是太低了,最後決定用亂序的方式,感覺還不錯。不知道還有沒有更好的辦法,請大家多多指教!using system using system.collections namesp...