| 记录编号 |
314628 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
844.[DreamTeam] 麻将 |
最终得分 |
100 |
| 用户昵称 |
可以的. |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.005 s |
| 提交时间 |
2016-10-03 20:48:28 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define M(a,v) memset(a,v,sizeof(a))
using namespace std;
const char* majia[28]={
"W1","W2","W3","W4","W5","W6","W7","W8","W9",
"T1","T2","T3","T4","T5","T6","T7","T8","T9",
"D1","D2","D3","D4","D5","D6","D7","D8","D9",
};
int mj[20],c[30];//对应的麻将 数量
string s;
int convert(string s){
for(int i=0;i<27;i++){
if(s == majia[i]) return i;
}
}
/*
W2 W3 T1 T2 T3 W9 W9 W9 T7 T7 T9 T9 D9
*/
void Read(){
for(int i=0;i<13;i++){
cin >> s;
mj[i] = convert(s);
}
}
void Prepare(){
M(c,0);
for(int i=0;i<13;i++){
c[mj[i]] ++ ;
}
}
bool Seven_judge(){
bool ok = true;
for(int i=0;i<13;i++){
if(c[mj[i]] && c[mj[i]] != 2){ ok = false; return 0; }
}
if(ok) return 1;
}
bool search(int dep){
for(int i=0;i<27;i++){
if(c[i] >= 3){ // 这叫刻子 ??
if(dep == 3) return true;
c[i] -= 3;
if( search(dep + 1) ) return true;
c[i] += 3;
}
}
for(int i=0;i<27;i++){ // 顺子
if(i % 9 <= 6 && c[i] >= 1 && c[i+1] >= 1 && c[i+2] >= 1){
if(dep == 3) return true;
c[i] -= 1; c[i+1] -= 1; c[i+2] -= 1;
if( search(dep + 1) ) return true;
c[i] += 1; c[i+1] += 1; c[i+2] += 1;
}
}
return false;
}
bool Check(){
for(int i=0;i<27;i++){
if(c[i] >= 2){
c[i] -= 2; // 做将牌
if(search(0)) return 1;
c[i] += 2;
}
}
return 0;
}
bool flag=0;
void Work(){
Read(); flag = 0;
for(int i=0;i<27;i++){//判断每张牌能不能和
Prepare();
if(c[i] >= 4) continue; // 最多四张
c[i] ++ ;
if( Seven_judge() ){
flag = 1;
printf("%s ",majia[i]);
c[i] -- ;
continue;
}
if( Check() ){
flag = 1;
printf("%s ",majia[i]);
}
c[i] -- ;
}
if(!flag){ printf("NO!"); return; }
}
/*
W3 W3 T1 T1 T2 T2 W9 W9 T7 T7 T9 T9 T9
*/
int main(){
freopen("majiang.in","r",stdin);
freopen("majiang.out","w",stdout);
Work();
//for(;;);
return 0;
}