2012-A3-0018

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

题意:给出13张牌,问加哪一张牌可以形成 1对 和 4个特定的三元组(或四元组,但四元组是不够的)...

注意每种牌最多4张,在已有不多于四张的牌中枚举即可,再行判断.. 

{{{
#include<cstdio>
#include<cstring>
#define go(i,n) for(size_t i=0;i<n;++i)
size_t st[128],p[34],x[34],ts[4],a;
char s[32];
bool melds(size_t nd){
    if(!nd)return 1;
    go(i,34)if(p[i]>2){
        p[i]-=3;if(melds(nd-1)){p[i]+=3;return 1;}p[i]+=3;
        /*if(p[i]&4){
            p[i]=0;if(melds(nd-1)){p[i]=4;return 1;}p[i]=4;
        }*/
    }
    go(s,3)go(i,7)if(p[s*9+i]&&p[s*9+i+1]&&p[s*9+i+2]){
        go(j,3)--p[s*9+i+j];
        if(melds(nd-1)){go(j,3)++p[s*9+i+j];return 1;}
        go(j,3)++p[s*9+i+j];
    }
    return 0;
}
int main(){
    for(ts[0]='m',st[ts[1]='p']=1,st[ts[2]='s']=2,st[ts[3]='z']=3;
                    gets(s);memset(p,a=0,34*4),putchar('\n')){
        go(i,13)++p[st[s[i<<1|1]]*9+s[i<<1]-'1'];
        go(i,34)if(p[i]<4){
            ++p[i];
            go(j,34)if(p[j]>1){
                p[j]-=2;
                if(melds(4)){p[j]+=2;x[a++]=i;break;}
                p[j]+=2;
            }
            --p[i];
        }
        printf("%u",a);
        if(a){putchar(' ');
            go(i,a)putchar(x[i]%9+'1'),putchar(ts[x[i]/9]);
        }
    }
}
}}}

题意:给出13张牌,问加哪一张牌可以形成 1对 和 4个特定的三元组(或四元组,但四元组是不够的)...

注意每种牌最多4张,在已有不多于四张的牌中枚举即可,再行判断..

#include<cstdio>
#include<cstring>
#define go(i,n) for(size_t i=0;i<n;++i)
size_t st[128],p[34],x[34],ts[4],a;
char s[32];
bool melds(size_t nd){
    if(!nd)return 1;
    go(i,34)if(p[i]>2){
        p[i]-=3;if(melds(nd-1)){p[i]+=3;return 1;}p[i]+=3;
        /*if(p[i]&4){
            p[i]=0;if(melds(nd-1)){p[i]=4;return 1;}p[i]=4;
        }*/
    }
    go(s,3)go(i,7)if(p[s*9+i]&&p[s*9+i+1]&&p[s*9+i+2]){
        go(j,3)--p[s*9+i+j];
        if(melds(nd-1)){go(j,3)++p[s*9+i+j];return 1;}
        go(j,3)++p[s*9+i+j];
    }
    return 0;
}
int main(){
    for(ts[0]='m',st[ts[1]='p']=1,st[ts[2]='s']=2,st[ts[3]='z']=3;
                    gets(s);memset(p,a=0,34*4),putchar('\n')){
        go(i,13)++p[st[s[i<<1|1]]*9+s[i<<1]-'1'];
        go(i,34)if(p[i]<4){
            ++p[i];
            go(j,34)if(p[j]>1){
                p[j]-=2;
                if(melds(4)){p[j]+=2;x[a++]=i;break;}
                p[j]+=2;
            }
            --p[i];
        }
        printf("%u",a);
        if(a){putchar(' ');
            go(i,a)putchar(x[i]%9+'1'),putchar(ts[x[i]/9]);
        }
    }
}