C算法编程题(一)扑克牌发牌
題目要求
程序描述:
一副紙牌有52張,4種花色,每種花色13張。我們能用一個(gè)整數(shù)m就表示出所有的52種情況,規(guī)則是:
? 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副撲克牌隨機(jī)抽取13張,發(fā)給某人的過(guò)程。
發(fā)牌后需要排序:規(guī)則是:先按花色,再按點(diǎn)數(shù)。花色的大小順序是:梅花、方塊、紅心、黑桃。點(diǎn)數(shù)的順序是:2、3、4、…. 10、J、Q、K、A。
然后,挑選出最大的連續(xù)牌型。規(guī)則是:連續(xù)張數(shù)多的大。張數(shù)相等的則花色大的大(此時(shí)與點(diǎn)數(shù)無(wú)關(guān))。
程序?qū)崿F(xiàn)
我們先分析下,上面的題目要求描述的很清楚了,我們要實(shí)現(xiàn)三個(gè)步驟:1,發(fā)牌(隨機(jī))2,排序 3,輸出最大的連續(xù)牌型。
1,發(fā)牌
這個(gè)比較簡(jiǎn)單,我直接貼下代碼:
1 int m,k=0,i,j,l,t,x,y; 2 int puKe[4][13]={0}; 3 int w[4]={0}; 4 char point[13]={'2','3','4','5','6','7','8','9','0','J','Q','K','A'}; 5 srand(time(NULL)); 6 while(k<13) 7 { 8 m=rand()%52; 9 x=m/13; 10 y=m%13; 11 if(puKe[x][y]==1) 12 { 13 continue; 14 } 15 puKe[x][y]=1; 16 printf("%c",x+3); 17 if(y==8) 18 { 19 printf("1"); 20 } 21 printf("%c ",point[y]); 22 k++; 23 }這里我們用point數(shù)組存儲(chǔ)點(diǎn)數(shù),puKe數(shù)組的下標(biāo)分別存儲(chǔ)花色和點(diǎn)數(shù),值為1表示這張牌已經(jīng)發(fā)了,x+3是花色的轉(zhuǎn)義字符。
2,排序
其實(shí)這個(gè)也好實(shí)現(xiàn),因?yàn)槲覀兇鎯?chǔ)的發(fā)牌在puKe數(shù)組中,排序規(guī)則是先按花色,再按點(diǎn)數(shù),這里我們用笨方法,用四個(gè)for循環(huán)就可以實(shí)現(xiàn),分別遍歷puKe數(shù)組。
示例代碼:
1 for(j=0;j<13;j++) 2 { 3 if(puKe[2][j]==1) 4 { 5 printf("%c",5); 6 if(j==8) 7 { 8 printf("1"); 9 } 10 printf("%c ",point[j]); 11 } 12 } 13 for(j=0;j<13;j++) 14 { 15 if(puKe[1][j]==1) 16 { 17 printf("%c",4); 18 if(j==8) 19 { 20 printf("1"); 21 } 22 printf("%c ",point[j]); 23 } 24 } 25 for(j=0;j<13;j++) 26 { 27 if(puKe[0][j]==1) 28 { 29 printf("%c",3); 30 if(j==8) 31 { 32 printf("1"); 33 } 34 printf("%c ",point[j]); 35 } 36 } 37 for(j=0;j<13;j++) 38 { 39 if(puKe[3][j]==1) 40 { 41 printf("%c",6); 42 if(j==8) 43 { 44 printf("1"); 45 } 46 printf("%c ",point[j]); 47 } 48 }3,輸出最大的連續(xù)牌型
示例代碼:
1 int count[4]={0}; 2 int index[4]={0}; 3 int temp=0; 4 for(i=0;i<4;i++) 5 { 6 for(j=0;j<13;j++) 7 { 8 if(j!=0) 9 { 10 if(puKe[i][j]==1 && puKe[i][j-1]==1) 11 { 12 temp++; 13 } 14 else 15 { 16 if(count[i]<temp) 17 { 18 count[i]=temp; 19 index[i]=j; 20 } 21 temp=0; 22 } 23 } 24 } 25 count[i]++; 26 } 27 28 int max=0; 29 if(count[3]>max) 30 { 31 max=count[3]; 32 temp=3; 33 } 34 for(i=0;i<3;i++) 35 { 36 if(count[i]>max) 37 { 38 max=count[i]; 39 temp=i; 40 } 41 } 42 43 int a=index[temp]-max; 44 for(i=0;i<max;i++) 45 { 46 printf("%c",temp+3); 47 if(a==8) 48 { 49 printf("1"); 50 } 51 printf("%c ",point[a]); 52 53 a++; 54 }count數(shù)組的意思是各個(gè)花色牌連續(xù)最大數(shù),index數(shù)組存儲(chǔ)的是開(kāi)始各個(gè)花色連續(xù)的開(kāi)始點(diǎn)數(shù),就是point數(shù)組的下標(biāo)。
實(shí)現(xiàn)效果:
全部程序代碼:
?View Code當(dāng)然這只是實(shí)現(xiàn)的一種方法,可能園友有更好的實(shí)現(xiàn)方法,歡迎指點(diǎn)。。。
本文轉(zhuǎn)自田園里的蟋蟀博客園博客,原文鏈接:http://www.cnblogs.com/xishuai/p/3392981.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的C算法编程题(一)扑克牌发牌的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下基于lvs-dr模式的电子商
- 下一篇: 分布式计算入门知识