麻将胡牌算法(不带赖子)(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 }
时间: 2024-11-09 03:15:49