ZOJ 3300 Mahjong DFS暴力解决。。
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; }