P2540 [NOIP2015 提高组] 斗地主 加强版

 

why sum[16] 就不行

//~~~ j>=j-k+1
//~~~ sum[i]=0 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e1;

int sum[200],n,ans=0x3f3f3f3f;

void dfs(int x)
{
    if(x>=ans) return;
    //dan_shunzi 
    int k=0;
    for(int i=3;i<=14;i++){
        if(sum[i]<=0) k=0;
        else{
            k++;
            if(k>=5){
                for(int j=i;j>=i-k+1;j--) sum[j]-=1;//!!!!!!!!! 
                dfs(x+1);
                for(int j=i;j>=i-k+1;j--) sum[j]+=1;
            }
        }    
    }
    //shuang_shunzi
    k=0;
    for(int i=3;i<=14;i++){
        if(sum[i]<=1) k=0;
        else{
            k++;
            if(k>=3){
                for(int j=i;j>=i-k+1;j--) sum[j]-=2;
                dfs(x+1);
                for(int j=i;j>=i-k+1;j--) sum[j]+=2;
            }
        }    
    }
    //sanshunzi 
    k=0;
    for(int i=3;i<=14;i++){
        if(sum[i]<=2) k=0;
        else{
            k++;
            if(k>=2){
                for(int j=i;j>=i-k+1;j--) sum[j]-=3;
                dfs(x+1);
                for(int j=i;j>=i-k+1;j--) sum[j]+=3;
            }
        }    
    }
    //dai_pai------>3+_
    k=0;
    for(int i=2;i<=14;i++){
        if(sum[i]<=3)
        {
            if(sum[i]<=2) continue;
            sum[i]-=3;
            //3+1
            //->
            for(int j=2;j<=15;j++){
                if(sum[j]<=0||i==j) continue;
                sum[j]--;
                dfs(x+1);
                sum[j]++;
            }
            sum[i]+=3;
            //3+2
            sum[i]-=3;
            for(int j=2;j<=14;j++){
                if(sum[j]<=1||i==j) continue;
                sum[j]-=2;
                dfs(x+1);
                sum[j]+=2;
            }
            sum[i]+=3;
        }
        else////////////////////////////////////////////king 15 16
        {
            sum[i]-=3;
            //3+1
            //->
            for(int j=2;j<=15;j++){
                if(sum[j]<=0||i==j) continue;
                sum[j]--;
                dfs(x+1);
                sum[j]++;
            }
            sum[i]+=3;
            //3+2
            sum[i]-=3;
            for(int j=2;j<=14;j++){
                if(sum[j]<=1||i==j) continue;
                sum[j]-=2;
                dfs(x+1);
                sum[j]+=2;
            }
            sum[i]+=3;
            
            //4+1+1
            sum[i]-=4;
            for(int j=2;j<=15;j++){
                if(sum[j]<=0||j==i) continue;
                sum[j]-=1;
                //->
                for(int k=2;k<=15;k++)
                {
                    //->
                    if(k==15&&j==15&&sum[15]){
                        sum[k]-=1;
                        dfs(x+1);
                        sum[k]+=1;
                    }
                //    if(j==15&&k==16||j==16&&k==15) continue; 
                    if(sum[k]<=0||k==j||k==i) continue;//+k==i
                    sum[k]-=1;
                    dfs(x+1);
                    sum[k]+=1; 
                }
                sum[j]+=1;
            }
            sum[i]+=4;
            //4+2+2
            sum[i]-=4;
            for(int j=2;j<=14;j++){
                if(sum[j]<=1||j==i) continue;
                sum[j]-=2;
                for(int k=2;k<=14;k++)
                {
                    if(sum[k]<=1||k==j||k==i) continue;
                    sum[k]-=2;
                    dfs(x+1);
                    sum[k]+=2; 
                }
                sum[j]+=2;
            }
            sum[i]+=4;
        }
    }
    // danpai ev tm chu 
    //-> 
    for(int i=2;i<=15;i++) if(sum[i]) x++;//还要回溯  所以不可以 sum[i]=0; 会更改TA的值导致回溯时候 值不对 
    ans=min(ans,x);
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    int T;cin>>T>>n;
    while(T--)
    {
        ans=0x3f3f3f3f;
        memset(sum,0,sizeof(sum));//memset
        
    //    cin>>n;
        for(int i=1;i<=n;i++){
            int x,y;cin>>x>>y;
            if(x==0) sum[15]++;
            //else if(x==0&&y==2) sum[16]++;
            else if(x==1) sum[14]++;
            else sum[x]++;//////////!!!!!!!!!!!!!!!! 
        }
        dfs(0);
        cout<<ans<<'\n';
        
    }
    
    return 0;
}
View Code

 

 
posted @ 2023-08-17 09:43  JMXZ  阅读(4)  评论(0)    收藏  举报