麻将算法

时间:2022-05-05
本文章向大家介绍麻将算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

麻将胡牌算法(不带赖子)(2天)

编码:(假设一副牌只有筒子 1表示1筒   2表示2筒。。。。 9表示9筒)

要求:

1)七对算法(判断14张牌是否是7对)

2)碰碰胡算法(判断14张牌是否是碰碰胡)

3)屁胡算法(判断14张牌是否是屁胡)

用户输入14张牌值,要求判断出这14张牌是否满足上述3种牌型(可能同时满足上述3种牌型)

     解答:  单纯的模拟题 简单的搜索(0(2^log2(n)))

  1 #define Local
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<time.h>
  6 
  7 
  8 int arg [14]= {0};
  9 
 10 
 11 int cmp(const void * arg ,const  void *brg){
 12 
 13   int * ar = (int *)arg;
 14   int * br = (int *)brg;
 15   return *ar - *br ;
 16 }
 17 
 18 //初始化
 19 void init( int A[] ){
 20  int i;
 21  srand( time(NULL) );
 22  for(i=0 ; i<14 ; i++)
 23     i[arg] = rand();
 24 }
 25 
 26 //七对胡牌
 27 bool  AlgSevenHu(int tmp[]){
 28      int i;
 29     for(i=1 ; i<10 ;i++)
 30       if(tmp[i]&1) return false ;     //不是七对
 31       return true;
 32 }
 33 
 34 //碰碰胡
 35 bool  AlgPengpHu(int tmp[]){
 36 
 37    int i=0 , cnt=0;
 38    //判断门将
 39     for( i=1 ; i<10 ; i++ ){
 40 
 41         if(tmp[i]==0||tmp[i]==3);
 42         else  if(tmp[i]==2)  cnt++;
 43         else return false ;
 44     }
 45       if(cnt==1)
 46          return true;
 47    return true;
 48 }
 49 
 50 //平胡
 51 bool AlgPinghHu(int tmp [] , int len){
 52 
 53   //qsort(A , 14 ,sizeof(A[0]) , cmp);   //升序
 54   //return dfs(A, 14);
 55    bool tag = false;
 56    int i;
 57      for(i=1 ; i<10 ; i++){
 58 
 59            if(tmp[i]>2){
 60               tmp[i]-=3;     //AAA组合
 61               len-=3;
 62              tag = AlgPinghHu(tmp , len);
 63               tmp[i]+=3;
 64               len+=3;
 65               if(tag) return true;
 66               //或者这样的组合
 67               if(tmp[i+1]>0&&tmp[i+2]>0){
 68                        tmp[i]--;
 69                        tmp[i+1]--;
 70                        tmp[i+2]--;
 71                        len-=3;
 72                 tag =  AlgPinghHu(tmp , len);
 73                        tmp[i]++;
 74                        tmp[i+1]++;
 75                        tmp[i+2]++;
 76                        len+=3;
 77                 if(tag) return true;
 78                 }
 79           }
 80          if(tmp[i]>0){
 81                 //ABC组合
 82                 if(len>2&&tmp[i+1]>0&&tmp[i+2]>0){
 83                        tmp[i]--;
 84                        tmp[i+1]--;
 85                        tmp[i+2]--;
 86                        len-=3;
 87                     tag= AlgPinghHu(tmp , len);
 88                        tmp[i]++;
 89                        tmp[i+1]++;
 90                        tmp[i+2]++;
 91                        len+=3;
 92                   if(tag) return true;
 93                 }
 94 
 95           if(len==2){
 96              if(tmp[i]==2)
 97                 return true ;
 98               return false;
 99              }
100           }
101    }
102    return false ;
103 }
104 
105 void print(int A[]){
106    int i=0;
107     for(i=0 ; i<13 ;i++ )
108         printf("%d ",A[i]);
109     printf("%dn",A[13]);
110 }
111 int main(int argv  , char * args [] ){
112 
113   char hopg[2];
114  //init(arg);
115    bool pi=0 ,pe=0 ,qi=0;
116    int i=0,tmp[10]={0};
117 #ifdef Local
118   freopen("data.in","r",stdin);
119 #endif // Local
120 
121  while(1){
122 
123    printf("输入14张牌号:n");
124    for( i=0;i<14 ;i++)
125       scanf("%d",arg+i);
126       print(arg);
127     memset(tmp , 0, sizeof(tmp));
128 
129    for( i=0;i<14;i++)  tmp[arg[i]]++;
130       pi =AlgPinghHu(tmp ,14);
131       pe =AlgPengpHu(tmp);
132       qi = AlgSevenHu(tmp);
133 
134     if(pi)
135       printf("祝贺 ,屁胡!n");
136     if(pe)
137          printf("祝贺 , 碰碰胡!n");
138     if(qi)
139         printf("祝贺,七对胡n");
140     if(!pi&&!pe&&!qi)
141         printf("未能胡牌!n");
142 
143      puts("继续游戏 y/n ?");
144      scanf("%s",hopg);
145 
146     if(hopg[0]=='n'||hopg[0]=='N')
147         break;
148  }
149   return 0;
150 }