求助大佬为什么这样写会出现牌数异常
查看原帖
求助大佬为什么这样写会出现牌数异常
648772
Liyuqiao11楼主2024/9/10 19:25
#include<bits/stdc++.h>
using namespace std;
const int N = 24;
int T,n,mp[N],ans=1e9,mp2[N];
struct T{
	int num;
	int col;
}a[N];
/*
1 13
8 2
6 3
8 4
12 3
3 2
13 1
10 4
9 2
7 1
2 2
8 3
4 2
5 2
*/
void dfs(int cnt,int y){
	if(cnt>=ans){
		return;
	}
	if(y==0){
		ans=min(ans,cnt);
		return;
	}
	for(int i=1;i<=12;i++){
		int tot=0;
		for(int j=i;j<=12;j++){
			if(mp[j]>=1){
				tot++;
			}
			else break;
		}
		if(tot>=5){
			for(int j=i;j<=i+tot-1;j++){
				mp2[mp[j]]--;
				mp[j]--;
				mp2[mp[j]]++;
				if((j-i+1)>=5){
					dfs(cnt+1,y-(j-i+1));
					for(int k=i;k<=j;k++){
						mp2[mp[k]]--;
						mp[k]++;
						mp2[mp[k]]++;
					}
				}
			}
		}
		tot=0;
		for(int j=i;j<=12;j++){
			if(mp[j]>=2){
				tot++;
			}
			else break;
		}
		if(tot>=3){
			for(int j=i;j<=i+tot-1;j++){
				mp2[mp[j]]--;
				mp[j]-=2;
				mp2[mp[j]]++;
				if((j-i+1)>=3){
					dfs(cnt+1,y-(j-i+1)*2);
					for(int k=i;k<=j;k++){
						mp2[mp[k]]--;
						mp[k]+=2;
						mp2[mp[k]]++;
					}
				}
			}
		}
		tot=0;
		for(int j=i;j<=12;j++){
			if(mp[j]>=3){
				tot++;
			}
			else break;
		}
		if(tot>=3){
			for(int j=i;j<=i+tot-1;j++){
				mp2[mp[j]]--;
				mp[j]-=3;
				mp2[mp[j]]++;
				if((j-i+1)>=3){
					dfs(cnt+1,y-(j-i+1)*3);
					for(int k=i;k<=j;k++){
						mp2[mp[k]]--;
						mp[k]+=3;
						mp2[mp[k]]++;
					}
				}
			}
		}
	}
	bool flag=true;
	int tmp=0;
	for(int i=1;i<=12;i++){
		if(mp[i]>=1){
			tmp++;
			if(tmp>=5){
				flag=false;
				break;
			}	
		}
		else{
			tmp=0;
		}
	}
	tmp=0;
	for(int i=1;i<=12;i++){
		if(mp[i]>=2){
			tmp++;
			if(tmp>=3){
				flag=false;
				break;
			}
		}
		else{
			tmp=0;
		}
	}
	tmp=0;
	for(int i=1;i<=12;i++){
		if(mp[i]>=3){
			tmp++;
			if(tmp>=3){
				flag=false;
				break;
			}
		}
		else{
			tmp=0;
		}
	}
	if(flag){
		if(mp[14]==1&&mp[15]==0){
			mp2[1]++;
		}
		else if(mp[14]==0&&mp[15]==1){
			mp2[1]++;
		}
		else if(mp[14]==1&&mp[15]==1){
			mp2[2]++;
		}
		int tot=0,z=mp2[1]/2;
		if(mp2[4]>=z){
			tot=tot+mp2[4]-z;
			mp2[1]-=z*2;
		}
		else{
			tot=tot+mp2[4];
			mp2[1]-=mp2[4]*2;
			mp2[4]=0;
		}
		if(mp2[4]>=mp2[2]){
			tot=tot+mp2[4];
			mp2[4]=0;
			mp2[2]=0; 
		}
		else{
			tot=tot+mp2[4];
			mp2[2]-=mp2[4];
			mp2[4]=0;
		}
		if(mp2[3]>=mp2[1]){
			tot=tot+mp2[1];
			mp2[3]-=mp2[1];
			mp2[1]=0;
		}
		else{
			tot=tot+mp2[3];
			mp2[1]-=mp2[3];
			mp2[3]=0;
		}
		if(mp2[3]>=mp2[2]){
			tot=tot+mp2[3];
			mp2[3]=0;
			mp2[2]=0;
		}
		else{
			tot=tot+mp2[3];
			mp2[2]-=mp2[3];
			mp2[3]=0;
		}
		tot=tot+mp2[2]+mp2[1];
		mp2[2]=0;
		mp2[1]=0;
		dfs(cnt+tot,0);
	}
}
int main(){
	cin>>T>>n;
	while(T--){
		for(int i=0;i<=17;i++) mp[i]=0;
		for(int i=0;i<=4;i++) mp2[i]=0;
		for(int i=1;i<=n;i++){
			cin>>a[i].num>>a[i].col;
			if(a[i].num==1) a[i].num=14;
			if(a[i].num==2) a[i].num=15;
			if(a[i].num==0&&a[i].col==1) a[i].num=16;
			if(a[i].num==0&&a[i].col==2) a[i].num=17;
			mp[a[i].num]++; 
		}
		for(int i=3;i<=17;i++){
			mp[i-2]=mp[i];
		}
		for(int i=1;i<=13;i++){
			mp2[mp[i]]++;
		}
		ans=1e9;
		dfs(0,n);
		cout<<ans<<endl;
	} 
	return 0;
} 
2024/9/10 19:25
加载中...