数组分析求解

时间:2021-06-02 11:30:37
有一个数组int arr[10];
arr[1]-arr[9]每个代表1-9每个数字的数目(最多4个),arr[0]是表示arr[1]-arr[9]的总个数,
例如 int arr[10]={6,0,0,0,3,1,1,1}
arr[0]表示共有六个元素,3个四,1个五,1个六,1个七

其实这个数组是表示麻将中的万,饼或条的数目的。上面的数组就表示3个四万,1个五万,1个六万,1个七万

求数组中刻,杠,顺子的数目,上例中刻就有一个,顺子有一个

8 个解决方案

#1


刻,杠,顺子的数目,
不懂啊!

你的题是很简单的

for(int i=0;i<9;i++)
{
if(a[i]==杠)
杠++;
.
.
.
.
}

#2


不是这么简单的,主要是顺子的情况 仔细想想

#3


刻,杠,是什么啊?

在数组里用什么表示啊?

#4


好啊,不错

#5


顺子又是什么啊?

#6


五万六万七万 连续的三个组成顺子  3个相同的为刻 4个相同的为杠
刻,和杠有时候要拆成顺子   
主要目的是求出最优解 最多共有几个顺子,刻,或杠

#7


可以理解LZ
主要是组合的问题
比如4个3万,1个4万,1个5万
如果算杠,有1个
如果算刻,有1个刻,1个顺
杠,遍历数组,找出arr[i]==4
刻,遍历数组,找出arr[i]==3
关键是顺,本来,主要arr中有连续3个大于0的即可,但是考虑到重叠,就不好算了

#8



void AnalyzeShunCardArrayWithSingle( int cardArr[10],int &gang,int &shunzi,int &ke,int &jiang,int &single,int &two)
{
static bool first=true;

if (!cardArr[0])
{
return;
}


for (int i=1;i<10;i++)
{
if (i<=7 && cardArr[i] && cardArr[i+1] && cardArr[i+2]) //顺子
{
shunzi++;
cardArr[i]--;
cardArr[i+1]--;
cardArr[i+2]--;
cardArr[0]-=3;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==4)
{
gang++;
cardArr[i]-=4;
cardArr[0]-=4;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==3)
{
ke++;
cardArr[i]-=3;
cardArr[0]-=3;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==2)
{
jiang++;
cardArr[i]-=2;
cardArr[0]-=2;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==1)
{
if (first)//获取连续两个麻将的数目
{
for (int i=1;i<10;)
{
if (i<=8 && cardArr[i]&&cardArr[i+1])
{
++two;
i+=2;
}
else
i++;

}
first=false;
}

single++;
cardArr[i]-=1;
cardArr[0]-=1;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
}
}


这是我原来的算法 但是发现有点问题,顺子的情况会出问题

#1


刻,杠,顺子的数目,
不懂啊!

你的题是很简单的

for(int i=0;i<9;i++)
{
if(a[i]==杠)
杠++;
.
.
.
.
}

#2


不是这么简单的,主要是顺子的情况 仔细想想

#3


刻,杠,是什么啊?

在数组里用什么表示啊?

#4


好啊,不错

#5


顺子又是什么啊?

#6


五万六万七万 连续的三个组成顺子  3个相同的为刻 4个相同的为杠
刻,和杠有时候要拆成顺子   
主要目的是求出最优解 最多共有几个顺子,刻,或杠

#7


可以理解LZ
主要是组合的问题
比如4个3万,1个4万,1个5万
如果算杠,有1个
如果算刻,有1个刻,1个顺
杠,遍历数组,找出arr[i]==4
刻,遍历数组,找出arr[i]==3
关键是顺,本来,主要arr中有连续3个大于0的即可,但是考虑到重叠,就不好算了

#8



void AnalyzeShunCardArrayWithSingle( int cardArr[10],int &gang,int &shunzi,int &ke,int &jiang,int &single,int &two)
{
static bool first=true;

if (!cardArr[0])
{
return;
}


for (int i=1;i<10;i++)
{
if (i<=7 && cardArr[i] && cardArr[i+1] && cardArr[i+2]) //顺子
{
shunzi++;
cardArr[i]--;
cardArr[i+1]--;
cardArr[i+2]--;
cardArr[0]-=3;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==4)
{
gang++;
cardArr[i]-=4;
cardArr[0]-=4;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==3)
{
ke++;
cardArr[i]-=3;
cardArr[0]-=3;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==2)
{
jiang++;
cardArr[i]-=2;
cardArr[0]-=2;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
else if (cardArr[i]==1)
{
if (first)//获取连续两个麻将的数目
{
for (int i=1;i<10;)
{
if (i<=8 && cardArr[i]&&cardArr[i+1])
{
++two;
i+=2;
}
else
i++;

}
first=false;
}

single++;
cardArr[i]-=1;
cardArr[0]-=1;
AnalyzeShunCardArrayWithSingle(cardArr,gang,shunzi,ke,jiang,single,two);
}
}
}


这是我原来的算法 但是发现有点问题,顺子的情况会出问题