完整的扑克牌

 

原有N套扑克牌,因天长日久均已张数不全。现把它们合在一起,看是否能凑成MM<N)套完整的扑克牌(不用考虑大小王)。

 

输入(请使用标准输入、输入,不要读写文件)

输入数据的第一行是一个数字N(1N20),表示原有N付牌。从第二行起,每4行用于描述一付牌的不同花色(固定为黑红草方的顺序)的现有张数(各行的第一位数)和牌号I1I13)(各行的其余的数字,无序)。

 

输出(请使用标准输入、输入,不要读写文件)

输出只有一行,即为你所能拼凑的扑克牌套数。

 

样例输入

样例输出

2

7  1  2  4  5  7  9  10

10  1  2  4  3  11  12  13  6  8  7

6  3  5  10  11  6  4

8  5  6  4  2  8  9  7  12

7  11  3  6  8  7  12  13

7  5  3  6  9  7  10  13

8  13  1  4  2  8  9  7  12

10  1  2  4  3  11  12  13  6  10  7

1

 

 

 

 

#include<stdio.h>

#include<math.h>

void main()

{

  //红桃:heart  黑桃:spade  梅花:club 方块:diamond  

  int min=20; //最多20幅牌

  int mins[4]={20,20,20,20}; //记录花色中最少的一张牌的张数

  int iHeartSize[13],iSpadeSize[13],iClubSize[13],iDiamondSize[13];//记录红黑梅方13张的情况,各有多少张

  int iHeart[20][13],iSpade[20][13],iClub[20][13],iDiamond[20][13];//记录红黑梅方20付牌13张的情况

  int iHeartCount = 0, iSpadeCount = 0 , iClubCount = 0 , iDiamondCount = 0;  //记录每次输入的每付牌的各种花色的张数

  int i = 0 , j = 0 , k = 0 , n =0 ;

  //数组初始化

  for( i = 0 ; i < 13 ; i++ )

  {

       iHeartSize[i] = iSpadeSize[i] = iClubSize[i] = iDiamondSize[i] = 0;

  }

 

  for( i = 0 ; i < 20 ; i++ )

  {

       for( j = 0 ; j < 13 ; j++ )

       {

              iHeart[i][j]   = 0;

              iSpade[i][j]   = 0;

              iClub[i][j]    = 0;

              iDiamond[i][j] = 0;

       }

  }

      

 

  do

  {

       printf("请输入牌的付数n(n<=20):/n");

      scanf("%d",&n);

  } while (  n > 20 || n < 1 );

 

 

  for( i = 0 ; i < n ; i++ )

  {

       scanf( "%d" , &iHeartCount );

      for( j = 0 ; j < iHeartCount ; j++ )

       {

           scanf("%d",&iHeart[i][j]);

       }

   

      scanf( "%d" , &iSpadeCount );

      for( j = 0 ; j < iSpadeCount ; j++ )

       {

              scanf("%d",&iSpade[i][j]);

       }

  

      scanf( "%d" , &iClubCount );

      for( j = 0 ; j < iClubCount ; j++ )

       {

           scanf("%d",&iClub[i][j]);

       }

 

      scanf( "%d" , &iDiamondCount );

      for( j = 0 ; j < iDiamondCount ; j++ )

       {

            scanf("%d",&iDiamond[i][j]);

       }

 

  }

 

 

  for( i = 0 ; i < n ; i++ )  //付数

  {

      for( j = 0 ; j < 13 ; j++ )//张数

       {

              for( k = 1; k <= 13 ; k++)//每张的号码

              {

                     if( iHeart[i][j] == k )

                     {

                            iHeartSize[k-1]++;

                     }

                  if( iSpade[i][j] == k )

                     {

                            iSpadeSize[k-1]++;

                     }

                  if( iClub[i][j] == k  )

                     {

                            iClubSize[k-1]++;

                     }

                  if( iDiamond[i][j] == k)

                     {

                            iDiamondSize[k-1]++;

                     }

              }

       }

      

  }

 

  for( i = 0 ; i < 13 ; i++ ) //计算每种花色每个牌号的最小张数      

  {

       if( iHeartSize[i] < mins[0] )

       {

              mins[0] = iHeartSize[i];

       }

 

      if( iSpadeSize[i] < mins[1] )

       {

              mins[1] = iSpadeSize[i];

       }

 

      if( iClubSize[i] < mins[2] )

       {

              mins[2] = iClubSize[i];

       }

 

      if( iDiamondSize[i] < mins[3] )

       {

              mins[3] = iDiamondSize[i];

       }

  }

 

 

  for( i = 0 ; i < 4 ; i++ )

  {

       if( mins[i] < min )

       {

              min = mins[i];

       }

  }

 

  printf( "%d/n", min );

      

}

你可能感兴趣的:(完整的扑克牌)