文章出處

前言

  上周寫《我的編程開始(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 }
View Code

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

  


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()