拖拉机牌型说明:手牌中同花色的牌组成如aabbcc或aabb类型的,被称为拖拉机
- 计算过程
输入一个数组,计算出来长度为4的拖拉机,和长度为6的拖拉机
- 实现
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
int GetTractor(vector<int> &srcData,vector<int> &retData,int terminalNum)
{
unsigned int len = srcData.size();
if(terminalNum % 2 != 0)
{
return -1;
}
if(len == 0)
{
return -1;
}
int maxCnt = 0;
for(int i = 0; i < len-1;++i)
{
if(srcData[i] - srcData[i+1] == 1)
{
++maxCnt;
if((maxCnt+1)*2 >= terminalNum)
{
retData.push_back(srcData[i - maxCnt +1]);
maxCnt -= 1;
}
}
else
{
maxCnt = 0;
}
}
std::sort(retData.begin(),retData.end(),greater<int>());
return 0;
}
int GetDouble(int srcData[],int len,vector<int> &dstVec)
{
if(len <= 0)
{
return -1;
}
std::map<int,int> mpDouble;
for(int i = 0 ; i < len;++i)
{
mpDouble[srcData[i]]++;
}
for(std::map<int,int>::iterator it = mpDouble.begin();it != mpDouble.end();++it)
{
if(it->second == 2)
{
dstVec.push_back(it->first);
}
}
std::sort(dstVec.begin(),dstVec.end(),greater<int>());
return 0;
}
- 测试
int main()
{
int srcData[] = {1,2,3,4,5,3,2,4,5,7,9,8,1,2,3,6,7,8,9,12,13,15,12,15,16,16,17,19,17};
int srcLen = sizeof(srcData)/sizeof(srcData[0]);
vector<int> dstDoubleVec;
vector<int> dstVec;
int res = GetDouble(srcData,srcLen,dstDoubleVec);
if(res != -1)
{
cout<<"double of array are:"<<endl;
for(int i = 0; i < dstDoubleVec.size();++i)
{
cout<<dstDoubleVec[i] << " ";
}
cout<<endl;
}
if (-1 != GetTractor(dstDoubleVec,dstVec,4))
{
cout<<"tractor of 4 are:" << endl;
for(int i = 0; i < dstVec.size();++i)
{
cout<<dstVec[i] << " ";
}
cout<<endl;
}
dstVec.clear();
if (-1 != GetTractor(dstDoubleVec,dstVec,6))
{
cout<<"tractor of 6 are:" << endl;
for(int i = 0; i < dstVec.size();++i)
{
cout<<dstVec[i] << " ";
}
cout<<endl;
}
}
- 结果
gcc -o test test.cpp -lstdc++