记录编号 |
314665 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[DreamTeam] 麻将 |
最终得分 |
100 |
用户昵称 |
可以的. |
是否通过 |
通过 |
代码语言 |
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;
}