草泥馬的鬥地主
阿新 • • 發佈:2019-01-01
#include<cstdio> #include<cstring> using namespace std; int n,t,s[15]; int ans,a,b; int min(int a,int b){return a>b?b:a;} void dfs(int now){ if(now>ans) return; int s1,s2,s3,s4; s1=s2=s3=s4=0; for(int i=1;i<=14;i++) if(s[i]==1) s1++;//統計單牌和對牌個數; for(int i=1;i<=14;i++) if(s[i]==2) s2++; for(int i=1;i<=14;i++) if(s[i]==4){ s4++; if(s1>=2) s1-=2; //四能多帶儘量多帶; else if(s2>=2) s2-=2; else if(s2>=1) s2--; } for(int i=1;i<=14;i++)if(s[i]==3){ s3++; if(s1>=1) s1--; //三帶; else if(s2>=1) s2--; } ans=min(ans,now+s1+s2+s3+s4); int j; for(int i=1;i<=8;i++){ //有單順子的情況; for(j=i;j<=12;j++){ s[j]--; if(s[j]<0) break; if(j-i>=4) dfs(now+1); } if(j==13) j--; //回溯; while(j>=i) s[j--]++; } for(int i=1;i<=10;i++){ //有雙順子的情況; for(j=i;j<=12;j++){ s[j]-=2; if(s[j]<0) break; if(j-i>=2) dfs(now+1); } if(j==13) j--; //回溯; while(j>=i) s[j--]+=2; } for(int i=1;i<=11;i++){ //有三順子的情況; for(j=i;j<=12;j++){ s[j]-=3; if(s[j]<0) break; if(j-i>=1) dfs(now+1); } if(j==13) j--; //回溯; while(j>=i) s[j--]+=3; } } int main(){ scanf("%d%d",&t,&n); while(t--){ memset(s,0,sizeof(s)); ans=23; for(int i=1;i<=n;i++){ //將A,2,大王,小王放到最後; scanf("%d%d",&a,&b); if(a==0) s[14]++; if(a==1) s[12]++; if(a==2) s[13]++; if(a>=3) s[a-2]++; } dfs(0); printf("%d\n",ans); } return 0; }
去年暴0真是永遠的痛啊。。。沒什麼可說的。。。就是先列舉所有順子的情況,,,然後再出。據說帶牌要儘量帶單牌。。。表示我打撲克還是太弱了啊。。
。