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

  实现效果:

  全部程序代码:

  View Code

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


本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/3392981.html,如需转载请自行联系原作者

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值