回复 20楼 azzbcc
谢谢你,看来看别人的东西更累,代价要高。
www.qunxingw.wang
#include<iostream> using namespace std; int main() { int i,x,flat=1; int b[14]={1,2,3,4,4,4,5,5,5,5,6,7,8,9};// 牌无需排序。 int a[10]={0}; for(i=0; i<14; i++) { a[b[i]-1]++; //统计每种牌的数量 } int xi,a2[10]; for (x=0; x<10; x++) //循环找一对将牌 { for(i=0;i<10;i++) a2[i]=a[i]; if(a2[x]>=2 )//,除掉将牌 { a2[x]-=2; } else continue; xi=0; flat=1; for(i=0; i<10; i++) //找出连续或相同的三个数 { if(a2[i]>=3) { a2[i]-=3; xi+=3; } if((a2[i]>0)&&(i>=8)) { flat=0; break; } if(a2[i]==2) { if((a2[i+1]>1)&&(a2[i+2]>1)) { a2[i]-=2; a2[i+1]-=2; a2[i+2]-=2; } else { flat=0; break; } } else if(a2[i]==1) { if((a2[i+1]>0)&&(a2[i+2]>0)) { a2[i]--; a2[i+1]--; a2[i+2]--; } else { flat=0; break; } } } if(flat==1) break; } if(flat) cout<<"恭喜您!已胡牌!"<<endl; else cout<<"对不起!不能胡牌!"<<endl; return 0; }
#include <math.h> #include <stdio.h> #include <string.h> #define Copy(a, b) memcpy((void *)a, (void *)b, 40) void initarray(int *a, int len, int *b, int mode) { //找到 b中不小于 mode的数,将其下标存入 a,a[0]是其个数 memset(a, 0, len); for (int i = 1;i < 10;++i) { a[0] += b[i] >= mode; if (a[0] && !a[a[0]]) a[a[0]] = i; } } int change(int *a, int flag[], int m) { int n = 0; if (m & 1) a[flag[1]] -= 3, ++n; if (m & 2) a[flag[2]] -= 3, ++n; if (m & 4) a[flag[3]] -= 3, ++n; if (m & 8) a[flag[4]] -= 3, ++n; return n; } int find(int *a) { for (int i = 1;i < 7;++i) if (a[i] && a[i+1] && a[i+2]) { --a[i];--a[i+1];--a[i+2]; return 1; } return 0; } int main() { int i, j, m, n, flag = 0; // int a[10] = {0, 2, 1, 2, 2, 1, 2, 0, 2, 2}; // int a[10] = {0, 2, 1, 2, 2, 1, 3, 0, 0, 3}; // int a[10] = {0, 3, 0, 2, 2, 2, 2, 0, 0, 3}; // int a[10] = {0, 2, 3, 2, 2, 2, 1, 1, 1, 0}; int a[10] = {0, 3, 3, 3, 3, 0, 1, 0, 1, 0}; int b[10], c[10], temp1[5], temp2[11]; initarray(temp1, sizeof(temp1), a, 3); for (i = (int)pow(2, temp1[0]);i;--i) { Copy(b, a); m = change(b, temp1, i-1); initarray(temp2, sizeof(temp2), b, 2); for (j = temp2[0];j;--j) { Copy(c, b);c[temp2[j]] -= 2; n = 0;while (find(c)) ++n; if (4 == m+n){flag = 1;break;} } if (flag) break; } if (flag) puts("YES!"); else puts("NO!"); return 0; }楼主的代码是还没改好吧,b数组没用到。想了一下应该是可以的,要加两个限定条件,有可能的将牌数 和 某处已被标记过,然后一次次把 b复制到 a就行。
if((a2[i]>0)&&(i>=8)) { flat=0; break; }表示疑惑,尚需努力啊!