前言
上周寫《我的編程開始(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; 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數組存儲點數,puKe數組的下標分別存儲花色和點數,值為1表示這張牌已經發了,x+3是花色的轉義字符。
2,排序
其實這個也好實現,因為我們存儲的發牌在puKe數組中,排序規則是先按花色,再按點數,這里我們用笨方法,用四個for循環就可以實現,分別遍歷puKe數組。
示例代碼:
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,輸出最大的連續牌型
示例代碼:
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數組的意思是各個花色牌連續最大數,index數組存儲的是開始各個花色連續的開始點數,就是point數組的下標。
實現效果:
全部程序代碼:

1 #include "stdio.h" 2 #include "string.h" 3 #include "time.h" 4 #include "stdlib.h" 5 #include "math.h" 6 7 void main() 8 { 9 int m,k=0,i,j,l,t,x,y; 10 int puKe[4][13]={0}; 11 int w[4]={0}; 12 char point[13]={'2','3','4','5','6','7','8','9','0','J','Q','K','A'}; 13 srand(time(NULL)); 14 while(k<13) 15 { 16 m=rand()%52; 17 x=m/13; 18 y=m%13; 19 if(puKe[x][y]==1) 20 { 21 continue; 22 } 23 puKe[x][y]=1; 24 printf("%c",x+3); 25 if(y==8) 26 { 27 printf("1"); 28 } 29 printf("%c ",point[y]); 30 k++; 31 } 32 printf("\n按任意鍵排序...."); 33 getchar(); 34 35 for(j=0;j<13;j++) 36 { 37 if(puKe[2][j]==1) 38 { 39 printf("%c",5); 40 if(j==8) 41 { 42 printf("1"); 43 } 44 printf("%c ",point[j]); 45 } 46 } 47 for(j=0;j<13;j++) 48 { 49 if(puKe[1][j]==1) 50 { 51 printf("%c",4); 52 if(j==8) 53 { 54 printf("1"); 55 } 56 printf("%c ",point[j]); 57 } 58 } 59 for(j=0;j<13;j++) 60 { 61 if(puKe[0][j]==1) 62 { 63 printf("%c",3); 64 if(j==8) 65 { 66 printf("1"); 67 } 68 printf("%c ",point[j]); 69 } 70 } 71 for(j=0;j<13;j++) 72 { 73 if(puKe[3][j]==1) 74 { 75 printf("%c",6); 76 if(j==8) 77 { 78 printf("1"); 79 } 80 printf("%c ",point[j]); 81 } 82 } 83 printf("\n按任意鍵輸出最大同花色連續牌...."); 84 getchar(); 85 86 int count[4]={0}; 87 int index[4]={0}; 88 int temp=0; 89 for(i=0;i<4;i++) 90 { 91 for(j=0;j<13;j++) 92 { 93 if(j!=0) 94 { 95 if(puKe[i][j]==1 && puKe[i][j-1]==1) 96 { 97 temp++; 98 } 99 else 100 { 101 if(count[i]<temp) 102 { 103 count[i]=temp; 104 index[i]=j; 105 } 106 temp=0; 107 } 108 } 109 } 110 count[i]++; 111 } 112 113 int max=0; 114 if(count[3]>max) 115 { 116 max=count[3]; 117 temp=3; 118 } 119 for(i=0;i<3;i++) 120 { 121 if(count[i]>max) 122 { 123 max=count[i]; 124 temp=i; 125 } 126 } 127 128 int a=index[temp]-max; 129 for(i=0;i<max;i++) 130 { 131 printf("%c",temp+3); 132 if(a==8) 133 { 134 printf("1"); 135 } 136 printf("%c ",point[a]); 137 138 a++; 139 } 140 }
當然這只是實現的一種方法,可能園友有更好的實現方法,歡迎指點。。。
文章列表