上週寫《我的程式設計開始(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這裡我們用point陣列儲存點數,puke陣列的下標分別儲存花色和點數,值為1表示這張牌已經發了,x+3是花色的轉義字元。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 }
2,排序
其實這個也好實現,因為我們儲存的發牌在puke陣列中,排序規則是先按花色,再按點數,這裡我們用笨方法,用四個for迴圈就可以實現,分別遍歷puke陣列。
示例**:
13,輸出最大的連續牌型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 }
示例**:
1count陣列的意思是各個花色牌連續最大數,index陣列儲存的是開始各個花色連續的開始點數,就是point陣列的下標。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 }
實現效果:
全部程式**:
1 #include "view codestdio.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 }
當然這只是實現的一種方法,可能園友有更好的實現方法,歡迎指點。。。
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...