题意:
给你13张牌,问你还有一张什么牌可以胡,把这些牌列出来;
思路:
首先麻将要胡的条件就是有且一个对子(两张一样),剩下的全部是三张或者顺子,我们一开始13张,加上一张,一共14张.
也就是要有一对对子,然后有四组三张或者顺子.牌一共34张,那么我们可以开始枚举;把每一张牌加进去,看看能不能胡;
首先有四张一样的就可以直接排除;
给你13张牌,问你还有一张什么牌可以胡,把这些牌列出来;
思路:
首先麻将要胡的条件就是有且一个对子(两张一样),剩下的全部是三张或者顺子,我们一开始13张,加上一张,一共14张.
也就是要有一对对子,然后有四组三张或者顺子.牌一共34张,那么我们可以开始枚举;把每一张牌加进去,看看能不能胡;
首先有四张一样的就可以直接排除;
然后我们判断是不是胡牌,先枚举出一堆对子,在判断剩下的是不是都是三张或者顺子就行了
AC
#include <cstdio>
#include <algorithm>
#include <cstring>
const char *mahjong[] = {
"1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",
"1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S",
"1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W",
"DONG", "NAN", "XI", "BEI",
"ZHONG", "FA", "BAI"
};
char s[20];
int mj[15];
int c[34];
int findmahjong( char *s){
for(int i = 0; i < 34; i++){
if( strcmp(mahjong[i], s) == 0)
return i;
}
return -1;
}
bool search(int successnum){
for(int i = 0; i < 34; i++){
if(c[i] >= 3){
if(successnum == 3)
return true;
c[i] -= 3;
if(search(successnum + 1) == true)
return true;
c[i] += 3;
}
}
for(int i = 0; i < 24; i++){
if( c[i] && c[i + 1] && c[i + 2] && i % 9 <= 6){
if(successnum == 3)
return true;
c[i]--;
c[i + 1]--;
c[i + 2]--;
if(search(successnum + 1) == true)
return true;
c[i]++;
c[i + 1]++;
c[i + 2]++;
}
}
return false;
}
int check(){
for(int i = 0; i < 34; i++){
if(c[i] >= 2){
c[i] -= 2;
if(search(0) == true) {
return true;
}
c[i] += 2;
}
}
return false;
}
int main() {
int cas = 1;
bool f;
while(scanf("%s", s) == 1){
if( s[0] == '0'){ break; }
mj[0] = findmahjong(s);
for(int i = 1; i < 13; i++){
scanf("%s", s);
mj[i] = findmahjong(s);
}
printf("Case %d:", cas++);
f = false;
for(int i = 0; i < 34; i++){
memset(c, 0, sizeof(c));
for(int j = 0 ; j < 13 ; j++) {
c[mj[j]]++;
}
if( c[i] >= 4)
continue;
c[i]++;
if(check() == true){
f = true;
printf(" %s", mahjong[i]);
}
c[i]--;
}
if(f == false)
printf(" Not ready");
printf("\n");
}
return 0;
}