大致目标:在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;
}