ZJU 3300: 题目描述
就看成1—9的数字,DFS暴力搜索下就过了。。。。。
要求输入13 个数字,声明个数组记录数字的个数,DFS 里各种回溯;
#include<stdio.h>
#include<string.h>
int p[12],flag;
int dfs(int x ,int y ){
int i;
if(flag) //找到了要的数字直接返回
return 1;
if(x==4&&y==1) {
flag=1;
return 1;
}
for(i=1;i<=9;i++){
if(p[i]>=3){ // 三个相同的牌
p[i]=p[i]-3;
dfs(x+1,y);
p[i]=p[i]+3;
}
if(p[i]>=2) { //两个相同的牌
p[i]=p[i]-2;
dfs(x,y+1);
p[i]=p[i]+2;
}
if(p[i]>=1&&p[i+1]>=1&&p[i+2]>=1) { //三个连牌
p[i]-=1,p[i+1]-=1,p[i+2]-=1;
dfs(x+1,y);
p[i]+=1,p[i+1]+=1,p[i+2]+=1;
}
}
return 0;
}
int main()
{
int i,n;
while(scanf("%d",&n)!=EOF){
flag=0;
int count=1;
memset(p,0,sizeof(p));
p[n]++;
for(i=0;i<12;i++){
scanf("%d",&n);
p[n]++;
}
for(i=1;i<=9;i++){
if(p[i]<=3)
p[i]++;
else
continue;
dfs(0,0);
if(count&&flag){ //格式注意
printf("%d",i);
flag=0;
count=0;
}
if(flag){
printf("% d",i);
flag=0;
}
p[i]--; //回溯
}
printf("\n");
}
return 0;
}