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]);
}
}
}