记录编号 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;
}