麻将胡牌算法(不带赖子)(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("%d\n",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 }


 麻将算法_#ifdef


编程是一种快乐,享受代码带给我的乐趣!!!