记录编号 314665 评测结果 AAAAAAAAAA
题目名称 [DreamTeam] 麻将 最终得分 100
用户昵称 Gravatar可以的. 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2016-10-03 21:32:16 内存使用 0.32 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define M(a,v) memset(a,v,sizeof(a))
using namespace std;

const char* majiang[30]={ // 指针 
	"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"
};
#define maxn 40
int mj[maxn],c[maxn];
string s;
int convert(string s){
	for(int i=0;i<27;i++){
		if(s == majiang[i]) return i;	
	}	
	return -1;
}
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(){
	for(int i=0;i<13;i++){
		if(c[mj[i]] && c[mj[i]] != 2){ return 0; }	
	}
	return 1;
}
bool search(int dep){
	//printf("dep = %d\n",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){
			//printf("顺子 %s %s\n",majiang[i],majiang[i+1]);
			//顺子 保证789
			if(dep == 3) return true;
			c[i] -- ; c[i+1] -- ; c[i+2] -- ;
			if( search(dep + 1) ) return true;
			c[i] ++ ; c[i+1] ++ ; c[i+2] ++ ;
		}
	}
	return false;
}
bool Check(){
	for(int i=0;i<27;i++){
		if(c[i] >= 2){// 选i当将牌 
			c[i] -= 2;	
			/*
			printf("i=%d\n",i);
			for(int j=0;j<27;j++){
				printf("c=%d ",c[j]);	
			}printf("\n"); getchar();
			*/
			if( search(0) ) return true;
			c[i] += 2; 
		}	
	}	
	return false;
}
bool ok =0;
void Work(){
	ok = false;
	for(int i=0;i<27;i++){ // 判断每张牌是否听
		Prepare(); 
		if(c[i] >= 4) continue; // 每张牌最多4张
		c[i] ++ ;
		if( Seven_judge() ){ // 
			c[i] -- ; ok = 1; printf("%s ",majiang[i]);
			continue;	
		}
		if( Check() ){
			ok = 1; printf("%s ",majiang[i]);	
		}
		c[i] -- ;
	}
	if( !ok ) puts("NO!");
}
int main(){
	freopen("majiang.in","r",stdin);freopen("majiang.out","w",stdout);
	Read();
	Work();
	return 0;
}