成都麻将
来源:互联网 发布:淘宝开店流程图解 编辑:程序博客网 时间:2024/04/20 11:20
#include<iostream>
#include<set>
#include <string>
#include <map>
using namespace std;
class cmp
{
public:
cmp();
bool operator()( string x,string y)
{
if( x[1] == y[1] )
{
return x[0]<y[0];
}
else
return c[ x[1] ] < c[ y[1] ];
}
public:
static map<char,int> c;
};
map<char,int> cmp::c;
cmp::cmp()
{
cmp::c['T'] = 1;
cmp::c['D'] = 2;
cmp::c['W'] = 3;
};
set<string,class cmp> result;
char type[3] = { 'T','D','W'};
void check( int cards[],int num)
{
//当不足3张牌时,判断胡什么牌
if( num < 3)
{
if( num == 1)
{
for( int i = 1 ; i< 30;i++)
{
if( cards[i] == 1 )
{
char p[3] ;
p[2] = '\0';
p[0] = (i % 10) + '0';
p[1] =type[ (i/10)];
result.insert( string(p) );
break;
}
}
}
else if( num == 2)
{
for( int i = 1 ; i< 30;i++)
{
if( cards[i] ==2 )
{
char p[3] ;
p[2] = '\0';
p[0] = (i % 10) + '0';
p[1] =type[ (i/10)];
result.insert( string(p) );
break;
}
if( cards[i] == 1 && cards[i+1] == 1)
{
char p[3] ;
p[2] = '\0';
if( (i+2) %10 != 0)
{
p[0] = ((i+2) % 10) + '0';
p[1] =type[ ((i+2) /10)];
result.insert( string(p) );
}
if( (i-1) %10 != 0)
{
p[0] = ((i-1) % 10) + '0';
p[1] =type[ ((i-1) /10)];
result.insert( string(p) );
}
break;
}
if( cards[i] == 1 && cards[i+2] == 1)
{
char p[3] ;
p[2] = '\0';
if( (i+1) % 10 != 0 )
{
p[0] = ((i+1) % 10) + '0';
p[1] =type[ ((i+1) /10)];
result.insert( string(p) );
}
break;
}
}
}
}
//牌多余三张时,提取
for( int i = 1 ; i< 30;i++)
{
//未提取过对子,提取
if( cards[i] >=2 && num%3 == 1)
{
cards[i] -= 2;
check(cards,num-2);
cards[i] += 2;
}
//可以提取三张,提取
if( cards[i] >=3 )
{
cards[i] -= 3;
check(cards,num-3);
cards[i] += 3;
}
if( cards[i] >=1 && cards[i +1] >=1 && cards[i+2] >=1 )
{
cards[i] -= 1;
cards[i+1] -= 1;
cards[i+2] -= 1;
check(cards,num-3);
cards[i] += 1;
cards[i+1] += 1;
cards[i+2] += 1;
}
}
}
int main()
{
freopen("input.txt","r",stdin);
string majiang;
while( cin>>majiang)
{
result.clear();
int cardInHand[33] = {0};
for( int i = 0; i < 25;i+=2)
{
char p = majiang[i+1];
char q = majiang[i];
switch( p )
{
case 'T':
cardInHand[ q - '0' ] ++;
break;
case 'D':
cardInHand[ q - '0' +10 ]++;
break;
case 'W':
cardInHand[ q- '0' + 20] ++;
break;
default:
;
}
}
/*for( int i = 0; i< 30; i++)
{
cout<< cardInHand[i]<<endl;
}*/
check( cardInHand ,13);
set<string,cmp>::iterator it = result.begin();
cout<<result.size()<<endl;
for( ;it != result.end() ;it++)
{
cout<< *it;
}
}
return 0;
}
#include<set>
#include <string>
#include <map>
using namespace std;
class cmp
{
public:
cmp();
bool operator()( string x,string y)
{
if( x[1] == y[1] )
{
return x[0]<y[0];
}
else
return c[ x[1] ] < c[ y[1] ];
}
public:
static map<char,int> c;
};
map<char,int> cmp::c;
cmp::cmp()
{
cmp::c['T'] = 1;
cmp::c['D'] = 2;
cmp::c['W'] = 3;
};
set<string,class cmp> result;
char type[3] = { 'T','D','W'};
void check( int cards[],int num)
{
//当不足3张牌时,判断胡什么牌
if( num < 3)
{
if( num == 1)
{
for( int i = 1 ; i< 30;i++)
{
if( cards[i] == 1 )
{
char p[3] ;
p[2] = '\0';
p[0] = (i % 10) + '0';
p[1] =type[ (i/10)];
result.insert( string(p) );
break;
}
}
}
else if( num == 2)
{
for( int i = 1 ; i< 30;i++)
{
if( cards[i] ==2 )
{
char p[3] ;
p[2] = '\0';
p[0] = (i % 10) + '0';
p[1] =type[ (i/10)];
result.insert( string(p) );
break;
}
if( cards[i] == 1 && cards[i+1] == 1)
{
char p[3] ;
p[2] = '\0';
if( (i+2) %10 != 0)
{
p[0] = ((i+2) % 10) + '0';
p[1] =type[ ((i+2) /10)];
result.insert( string(p) );
}
if( (i-1) %10 != 0)
{
p[0] = ((i-1) % 10) + '0';
p[1] =type[ ((i-1) /10)];
result.insert( string(p) );
}
break;
}
if( cards[i] == 1 && cards[i+2] == 1)
{
char p[3] ;
p[2] = '\0';
if( (i+1) % 10 != 0 )
{
p[0] = ((i+1) % 10) + '0';
p[1] =type[ ((i+1) /10)];
result.insert( string(p) );
}
break;
}
}
}
}
//牌多余三张时,提取
for( int i = 1 ; i< 30;i++)
{
//未提取过对子,提取
if( cards[i] >=2 && num%3 == 1)
{
cards[i] -= 2;
check(cards,num-2);
cards[i] += 2;
}
//可以提取三张,提取
if( cards[i] >=3 )
{
cards[i] -= 3;
check(cards,num-3);
cards[i] += 3;
}
if( cards[i] >=1 && cards[i +1] >=1 && cards[i+2] >=1 )
{
cards[i] -= 1;
cards[i+1] -= 1;
cards[i+2] -= 1;
check(cards,num-3);
cards[i] += 1;
cards[i+1] += 1;
cards[i+2] += 1;
}
}
}
int main()
{
freopen("input.txt","r",stdin);
string majiang;
while( cin>>majiang)
{
result.clear();
int cardInHand[33] = {0};
for( int i = 0; i < 25;i+=2)
{
char p = majiang[i+1];
char q = majiang[i];
switch( p )
{
case 'T':
cardInHand[ q - '0' ] ++;
break;
case 'D':
cardInHand[ q - '0' +10 ]++;
break;
case 'W':
cardInHand[ q- '0' + 20] ++;
break;
default:
;
}
}
/*for( int i = 0; i< 30; i++)
{
cout<< cardInHand[i]<<endl;
}*/
check( cardInHand ,13);
set<string,cmp>::iterator it = result.begin();
cout<<result.size()<<endl;
for( ;it != result.end() ;it++)
{
cout<< *it;
}
}
return 0;
}
0 0
- 成都麻将
- 成都麻将胡牌规则
- 成都麻将胡牌规则
- 【求助】华为OJ题 成都麻将胡牌规则
- 麻将
- 麻将
- 麻将
- 麻将
- 麻将
- 麻将
- 中国城市批判——玩物丧志的成都:一座砌在麻将桌上的城市
- 麻将,麻将!
- 成都
- 《成都》
- 快乐麻将
- 麻将趣事
- 广东麻将
- 麻将游戏
- 如何系统地自学一门Python 语言?https://mp.weixin.qq.com/s?__biz=MzA3ODY0MzEyMA==&mid=408122444&idx=2&sn=ae6f3ddd
- CSS学习(二十)-flexbox模型
- 方法,传真和传引用
- Spring学习之一基础篇
- C语言库函数三
- 成都麻将
- 阿里云CentOS 7.1编译安装MySql5.6.24
- 在Eclipse中进行C++开发
- Shader渲染队列设置
- 关于MVVM一些想法
- 工作第六天总结/
- LEETCODE 338
- 关于"堆和栈"的几个问题
- css负边距问题