麻将胡牌算法
对于此游戏的基本算法本人独自想了好久,用了一个很笨的方法,总算有了一个结果,但对此算法没有严谨的证明,只是感觉上好象是这么回事。基本思想是,(麻将最多手上14只,)在第15张位置加上一个将牌,那么再让这个数组不相同的三个数 组合 若是一句话,或是相同的三个数就让这三个数置0。如果胡牌的话,则此数组应该全部为0了。 这种方法不严谨 。如2 2 3 3 4 4 5 5 6 6 7 7 8 9这样的数7已先和前面的组合了,最后改变以除掉将的方式 见19楼。希望有兴趣的朋友再帮我测试最后的程序,谢谢。
程序代码:
#include<iostream> using namespace std; int main() { cout<<"如果胡牌则显示,不胡牌则以下无输出"<<endl; int i,j,k,x,temp,flat=0; int a[15]={1,1,1,2,2,2,4,5,6,8,8,8,9,9};// 牌已排序。 for (x=0; x<14; x++) //在数组最后位置加一个数,便以下判断是否全部清0 { if(a[x]==a[x+1]) { temp=a[x]; a[14]=a[x]; } else a[x]=temp; for(i=0; i<15; i++) //找出连续或相同的三个数,并标记为0 for(j=0; j<15; j++) for(k=0; k<15; k++) { if(i==j||j==k||i==k) continue; if(a[i]+1==a[j] && a[j]+1==a[k]&& a[i]!=0 || a[i]==a[j] && a[k]==a[j] ) { a[i]=0; a[j]=0; a[k]=0; } } int s=0; for(i=0;i<15;i++) { s+=a[i]; cout<<a[i];} cout<<endl; cout<<s<<"s "; /* if(s!=0) //若加的将不胡,则下次试其他将时还回原值。 { a[x]=temp; a[x+1]=temp; a[14]=flat; }*/ if(s==0) { cout<<"恭喜您!已胡牌!"<<endl;//如果数组里全部是0说明已胡牌, // break; } } getchar(); return 0; }
[ 本帖最后由 qunxingw 于 2013-1-16 19:48 编辑 ]