C算法编程题(一)扑克牌发牌

前言

  上周写《我的编程开始(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数组的下标。

  实现效果:

  全部程序代码:

C算法编程题(一)扑克牌发牌
  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

  当然这只是实现的一种方法,可能园友有更好的实现方法,欢迎指点。。。

  

你可能感兴趣的:(编程)