今日头条编程题:雀魂启动

#include

using namespace std;

/*除去雀头后的12张牌能否组成4个顺子或刻子*/

bool IsOk(vector num){

int sz = num.size();

if(sz == 3){

if((num[0]==num[1] && num[0]==num[2]) || (num[0]+1==num[1] && num[0]+2==num[2]))

return true;

return false;

}

sort(num.begin(),num.end());

int cnt = count(num.begin(),num.end(),num[0]);

int p = -1,q=-1;

for(auto i = 1;i < sz;++i){

if(num[i] == num[0] + 1)

p = i;

if(num[i] == num[0] + 2)

q = i;

}

if(cnt > 2){

vector tmp1(sz - 3,0);

copy(num.begin()+3,num.end(),tmp1.begin());

if(p!=-1 && q != -1){

vector tmp2(sz,0);

copy(num.begin(),num.end(),tmp2.begin());

tmp2.erase(tmp2.begin());

tmp2.erase(tmp2.begin() + p - 1);

tmp2.erase(tmp2.begin() +  q - 2);

return IsOk(tmp1) || IsOk(tmp2);

}

return IsOk(tmp1);

}

else{

if(p != -1 && q != -1){

vector tmp3(sz,0);

copy(num.begin(),num.end(),tmp3.begin());

tmp3.erase(tmp3.begin());

tmp3.erase(tmp3.begin() + p - 1);

tmp3.erase(tmp3.begin() +  q - 2);

return IsOk(tmp3);

}

return false;

}

}

void remove_by_val(vector &num,int val,int cnt){

int p = -1;

sort(num.begin(),num.end());

for(auto i = 0;i < num.size();++i){

if(num[i] == val){

p = i;

break;

}

}

num.erase(num.begin() + p,num.begin() + p + cnt);

}

void  func(vector num,vector &ret){

for(auto i = 1;i < 10;++i){

if(count(num.begin(),num.end(),i) > 3)

continue;

num[13] = i;

sort(num.begin(),num.end());

map cnt;

for(auto elem:num)

cnt[elem] += 1;

for(auto it = cnt.begin();it != cnt.end();++it){

if(it->second > 1){

vector tmp(14,0);

copy(num.begin(),num.end(),tmp.begin());

remove_by_val(tmp,it->first,2);

if(IsOk(tmp)){

ret.push_back(i);

break;

}

}

}

for(auto j = 0;j < 14;++j){

if(num[j] == i){

swap(num[j],num[13]);

break;

}

}

}

}

int main(){

vector num(14,0);

for(auto i = 0;i<13;++i)

cin >> num[i];

vector ret;

func(num,ret);

if(ret.empty())

cout<<0<

else{

for(auto i = 0 ;i < ret.size() - 1;++i)

cout<

cout<

}

return 0;

}

你可能感兴趣的:(今日头条编程题:雀魂启动)