大致目标:在N张牌中取出顺子并打印。请各位大牛帮帮忙,很快就会结贴!
// NCard.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <string>
#define SeqNum 8
#define CardClass 13
using namespace std;int BigSeq[SeqNum][2]; //记录顺子起始位置,长度
int SmallSeq[52][2]; //记录零散牌起始位置,长度
int Card[CardClass]; //记录各卡片数量
int SeqCount;
void Translate(const char* str)
{
char c;
while('\0'!=(c=*str++))
{
if(c>=2+'0'&& c<=9+'0') Card[c-'0'-2]+=1;
else
{
switch(c)
{
case 'B' : Card[8]++;break;
case 'J' : Card[9]++;break;
case 'Q' : Card[10]++;break;
case 'K' : Card[11]++;break;
case 'A' : Card[12]++;break;
}
}
}}
void Segmention(int SmallCount)
{
int i=0,index=0,temp;
for(index=SmallCount-1;index>=0;index--)
{
for(i=0;i<SeqCount;i++)
{
if(SmallSeq[index][0]>=BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])>=(SmallSeq[i][0]+SmallSeq[i][1])) //完全包含
{
if((SmallSeq[index][0]-BigSeq[i][0]+SmallSeq[index][1])>=5&&(BigSeq[i][1]-SmallSeq[index][0]+BigSeq[i][0])>=5) //可分
{
temp=BigSeq[i][1];
BigSeq[i][1]=SmallSeq[index][0]-BigSeq[i][0]+SmallSeq[index][1];
BigSeq[SeqCount][0]=SmallSeq[index][0];
BigSeq[SeqCount][1]=temp-SmallSeq[index][0]+BigSeq[i][0];
SeqCount++;
break;
}
}
else if(SmallSeq[index][0]>BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])<(SmallSeq[i][0]+SmallSeq[i][1])) //尾部交叉
{
temp=SmallSeq[index][0]+SmallSeq[index][1]-BigSeq[i][0]-BigSeq[i][1];
BigSeq[i][1]+=temp;
SmallSeq[index][1]-=temp;
}
else if(SmallSeq[index][0]<BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])<(SmallSeq[i][0]+SmallSeq[i][1])) //首部交叉
{
temp=BigSeq[i][0]-SmallSeq[index][0];
BigSeq[i][0]=SmallSeq[index][0];
SmallSeq[index][0]=BigSeq[i][0]+temp;
BigSeq[i][1]+=temp;
SmallSeq[index][1]-=temp;
}
}
}
}
void ScanCards()
{
int i=0,bi=0,si=0,len=0,begin=-1;
int CardNum=0; //牌的数量
SeqCount=0;
for(i=0;i<CardClass;i++)
{
CardNum+=Card[i];
}
while(CardNum>0)
{ begin=-1;
for(i=0;i<CardClass;i++)
{
if(0==Card[i])
{
if(-1==begin) continue;
else
{
len=i-begin;
if(len>0)
{
if(len<5) //是小顺子
{
SmallSeq[si][0]=begin;
SmallSeq[si][1]=len;
si++;
}
else //是大顺子
{
BigSeq[bi][0]=begin;
BigSeq[bi][1]=len;
bi++;
}
}
begin=-1;
}
}
else
{
if(-1==begin) begin=i;
Card[i]--;
CardNum--;
}
}
if(-1!=begin)
{
len=CardClass-begin;
if(len>0)
{
if(len<5) //是小顺子
{
SmallSeq[si][0]=begin;
SmallSeq[si][1]=len;
si++;
}
else //是大顺子
{
BigSeq[bi][0]=begin;
BigSeq[bi][1]=len;
bi++;
}
}
}
}
SeqCount=bi;
Segmention(si);
}
void PrintCards()
{
cout<<"There are "<<SeqCount<<" Sequences!"<<endl;
int i=0,num;
for(i=0;i<SeqCount;i++)
{
num=BigSeq[i][0];
int j=0;
for(j=0;j<BigSeq[i][1];j++)
{
if(num>=0&&num<=8)
cout<<num+2<<",";
else
{
switch(num)
{
case 9: cout<<"J,";break;
case 10: cout<<"Q,";break;
case 11: cout<<"K,";break;
case 12: cout<<"A,";break;
}
}
num++;
}
cout<<endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//string cards("235677899@@JJQKKAA");
string cards("2356788999@@@JJKKAA"); //@为B,而B代表10 几个B连起来被百度屏掉了
int i;
for(i=0;i<CardClass;i++)
Card[i]=0;
for(i=0;i<SeqNum;i++)
{
BigSeq[i][0]=0; BigSeq[i][1]=0;
}
const char *p = cards.c_str();
Translate(p);
ScanCards();
PrintCards();
return 0;
}
// NCard.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include <string>
#define SeqNum 8
#define CardClass 13
using namespace std;int BigSeq[SeqNum][2]; //记录顺子起始位置,长度
int SmallSeq[52][2]; //记录零散牌起始位置,长度
int Card[CardClass]; //记录各卡片数量
int SeqCount;
void Translate(const char* str)
{
char c;
while('\0'!=(c=*str++))
{
if(c>=2+'0'&& c<=9+'0') Card[c-'0'-2]+=1;
else
{
switch(c)
{
case 'B' : Card[8]++;break;
case 'J' : Card[9]++;break;
case 'Q' : Card[10]++;break;
case 'K' : Card[11]++;break;
case 'A' : Card[12]++;break;
}
}
}}
void Segmention(int SmallCount)
{
int i=0,index=0,temp;
for(index=SmallCount-1;index>=0;index--)
{
for(i=0;i<SeqCount;i++)
{
if(SmallSeq[index][0]>=BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])>=(SmallSeq[i][0]+SmallSeq[i][1])) //完全包含
{
if((SmallSeq[index][0]-BigSeq[i][0]+SmallSeq[index][1])>=5&&(BigSeq[i][1]-SmallSeq[index][0]+BigSeq[i][0])>=5) //可分
{
temp=BigSeq[i][1];
BigSeq[i][1]=SmallSeq[index][0]-BigSeq[i][0]+SmallSeq[index][1];
BigSeq[SeqCount][0]=SmallSeq[index][0];
BigSeq[SeqCount][1]=temp-SmallSeq[index][0]+BigSeq[i][0];
SeqCount++;
break;
}
}
else if(SmallSeq[index][0]>BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])<(SmallSeq[i][0]+SmallSeq[i][1])) //尾部交叉
{
temp=SmallSeq[index][0]+SmallSeq[index][1]-BigSeq[i][0]-BigSeq[i][1];
BigSeq[i][1]+=temp;
SmallSeq[index][1]-=temp;
}
else if(SmallSeq[index][0]<BigSeq[i][0]&&(BigSeq[i][0]+BigSeq[i][1])<(SmallSeq[i][0]+SmallSeq[i][1])) //首部交叉
{
temp=BigSeq[i][0]-SmallSeq[index][0];
BigSeq[i][0]=SmallSeq[index][0];
SmallSeq[index][0]=BigSeq[i][0]+temp;
BigSeq[i][1]+=temp;
SmallSeq[index][1]-=temp;
}
}
}
}
void ScanCards()
{
int i=0,bi=0,si=0,len=0,begin=-1;
int CardNum=0; //牌的数量
SeqCount=0;
for(i=0;i<CardClass;i++)
{
CardNum+=Card[i];
}
while(CardNum>0)
{ begin=-1;
for(i=0;i<CardClass;i++)
{
if(0==Card[i])
{
if(-1==begin) continue;
else
{
len=i-begin;
if(len>0)
{
if(len<5) //是小顺子
{
SmallSeq[si][0]=begin;
SmallSeq[si][1]=len;
si++;
}
else //是大顺子
{
BigSeq[bi][0]=begin;
BigSeq[bi][1]=len;
bi++;
}
}
begin=-1;
}
}
else
{
if(-1==begin) begin=i;
Card[i]--;
CardNum--;
}
}
if(-1!=begin)
{
len=CardClass-begin;
if(len>0)
{
if(len<5) //是小顺子
{
SmallSeq[si][0]=begin;
SmallSeq[si][1]=len;
si++;
}
else //是大顺子
{
BigSeq[bi][0]=begin;
BigSeq[bi][1]=len;
bi++;
}
}
}
}
SeqCount=bi;
Segmention(si);
}
void PrintCards()
{
cout<<"There are "<<SeqCount<<" Sequences!"<<endl;
int i=0,num;
for(i=0;i<SeqCount;i++)
{
num=BigSeq[i][0];
int j=0;
for(j=0;j<BigSeq[i][1];j++)
{
if(num>=0&&num<=8)
cout<<num+2<<",";
else
{
switch(num)
{
case 9: cout<<"J,";break;
case 10: cout<<"Q,";break;
case 11: cout<<"K,";break;
case 12: cout<<"A,";break;
}
}
num++;
}
cout<<endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//string cards("235677899@@JJQKKAA");
string cards("2356788999@@@JJKKAA"); //@为B,而B代表10 几个B连起来被百度屏掉了
int i;
for(i=0;i<CardClass;i++)
Card[i]=0;
for(i=0;i<SeqNum;i++)
{
BigSeq[i][0]=0; BigSeq[i][1]=0;
}
const char *p = cards.c_str();
Translate(p);
ScanCards();
PrintCards();
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货