mle(爆栈了),萌新求助,悬赏1关注
查看原帖
mle(爆栈了),萌新求助,悬赏1关注
855557
conyon楼主2023/12/30 18:40
#include <bits/stdc++.h>
using namespace std; 
int card[20];
int ans=1e9;

void dfs(int step,int num){
   if(step>=ans)return;
	if(num<=0){
		ans=min(step,ans);
		return;
	}//四带二对
    for(int i=0;i<=13;i++){
        if(card[i]>=4){
            card[i]-=4;
            for(int j=0;j<=13;j++){
                if(card[j]>=2)
                    card[j]-=2;
                for(int k=0;k<=13;k++){
                    if(card[k]>=2){
                        card[k]-=2;
                        dfs(num+1,num-8);
                        card[k]+=2;
                    }
                }
                card[j]+=2;
            }
        }
        card[i]+=4;
    }
    //四带二单
    for(int i=0;i<=13;i++){
        if(card[i]>=4)
            card[i]-=4;
            for(int j=0;j<=13;j++){
                if(card[j]>=1)
                    card[j]-=1;
                for(int k=0;k<=13;k++){
                    if(card[k]>=1){
                        card[k]-=1;
                        dfs(num+1,num-6);
                        card[k]+=1;
                    }
                }
                card[j]+=1;
            }
        card[i]+=4;
    }
    //三顺子
    for(int i=1;i<=11;i++){
        if(card[i]>=3){
            card[i]-=3;
            int cnt=1;
            for(int j=i+1;j<=12;j++){
                if(!card[j])break;
                cnt++;
                card[j]-=3;
                if(cnt>=2) dfs(step+1,num-2*cnt);
            }
            for(int i=1;i<=i+cnt-1;i++){
                card[i]+=2;
            }
        }
   }
    //二顺子
    for(int i=1;i<=10;i++){
        if(card[i]>=2){
            card[i]-=2;
            int cnt=1;
            for(int j=i+1;j<=12;j++){
                if(!card[j])break;
                cnt++;
                card[j]-=2;
                if(cnt>=3) dfs(step+1,num-2*cnt);
            }
            for(int i=1;i<=i+cnt-1;i++){
                card[i]+=2;
            }
        }
   }
    //顺子
    for(int i=1;i<=8;i++){
        if(card[i]){
            card[i]--;
            int cnt=1;
            for(int j=i+1;j<=12;j++){
                if(!card[j])break;
                cnt++;
                card[j]--;
                if(cnt>=5) dfs(step+1,num-cnt);
            }
            for(int i=1;i<=i+cnt-1;i++){
                card[i]++;
            }
        }
   }
    //三带二
    for(int i=0;i<=13;i++){
        if(card[i]>=3)
            card[i]-=3;
            for(int j=0;j<=13;j++){
                if(card[j]>=2){
                    card[j]-=2;
                    dfs(step+1,num-5);
                    card[j]+=2;
                }
            }
        card[i]+=3;
    }
    //三带一
   for(int i=0;i<=13;i++){
        if(card[i]>=3)
            card[i]-=3;
            for(int j=0;j<=13;j++){
                if(card[j]>=1){
                    card[j]-=1;
                    dfs(step+1,num-4);
                    card[j]+=1;
                }
            }
        card[i]+=3;
    }
//    //三张
//    for(int i=1;i<=13;i++){
//        if(card[i]>=3){
//            card[i]-=3;
//            dfs(step+1,num-3);
//            card[i]+=3;
//        }
//    }

	int cc=0,cnt=0;
	for(int i=1;i<=13;i++){
		if(card[i]){
			cc++;
			cnt+=card[i];
			}
		}
		dfs(step+cc,num-cnt);
}
int main() {
    ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    int n,T;
    cin>>T>>n;
    while(T--){
    	for(int j=1;j<=n;j++) card[j]=0;
        for(int i=1;i<=n;i++){
            int a,b;
            cin>>a>>b;
            if(a>=3)a-=2;
            else if(a==1)a=12;
            else if(a==2)a=13;
            card[a]++;
        }
       ans=1e9;
       dfs(0,n);
       cout<<ans<<'\n';
    }
}
2023/12/30 18:40
加载中...