回复 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;
}表示疑惑,尚需努力啊!