Fork me on GitHub

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数组的下标。

  实现效果:

  全部程序代码:

  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

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

  

posted @ 2013-10-29 10:34  田园里的蟋蟀  阅读(9910)  评论(7编辑  收藏  举报