有没有人能解释一下这组数据
查看原帖
有没有人能解释一下这组数据
735509
yangzichen1203楼主2025/8/30 18:14

input

3 10
MP P F P F 
FP F W D P 
FP P Z P K 
F K N N N N K W K F

ans

MP
K F 
DEAD
DEAD

my output

MP
F F 
DEAD
DEAD

mp code

#include<bits/stdc++.h>
#define For(i,j,k) for(auto i=j;i<=k;i++)
#define dFor(i,j,k) for(auto i=j;i>=k;i--)
#define MAXN 11
using namespace std;
int n,m,pig[MAXN];//1=主猪 2=忠猪 3=反猪 
vector<char> pigcard[MAXN],card;
int sumcard[MAXN][256];
//P=桃 K=杀 D=闪 F=决斗 N=南猪入侵 W=万箭齐发 J=无懈可击 Z=猪哥连弩
int nxt[MAXN],prv[MAXN],blood[MAXN];
bool live[MAXN],zgln[MAXN];
int jump[MAXN];//跳忠=1 跳反=2
bool think[MAXN];//主猪认为是不是类反猪 
int game=-1,sumfp=0;//反猪胜利=1 忠猪胜利=2
void print(){
	cout<<"Blood:";
	For(i,1,n) cout<<blood[i]<<' ';
	cout<<endl;
	cout<<"Jump:";
	For(i,1,n) cout<<jump[i]<<' ';
	cout<<endl;
	cout<<"Think:";
	For(i,1,n) cout<<think[i]<<' ';
	cout<<endl;
	cout<<"ZGLN:";
	For(i,1,n) cout<<zgln[i]<<' ';
	cout<<endl;
	cout<<"SumFP:"<<sumfp<<endl;
	cout<<"Game:"<<game<<endl;
	For(i,1,n){
		cout<<i<<':';
		if(!live[i]) cout<<"DEAD"<<endl;
		else{
			for(char c:pigcard[i]) cout<<c<<' ';
			cout<<endl;
		}
	}
	cout<<"Card:";
	for(char c:card) cout<<c<<' ';
	cout<<endl;
}
bool biaodiyi(int x,int y,bool op){//x向y表敌意 op:是否能全场 
	if(pig[x]==1){
		return jump[y]==2||think[y];
	}else if(pig[x]==2){
		if(jump[y]==2){
			jump[x]=1;think[x]=0;
			return 1;
		}else return 0;
	}else{
		if((op==0&&jump[y]==1)||(op==1&&pig[y]==1)){
			jump[x]=2;
			return 1;
		}else return 0;
	}
}
void qipai(int x,char c){
	cout<<x<<' '<<c<<endl;
	sumcard[x][c]--;
	for(auto it=pigcard[x].begin();it!=pigcard[x].end();it++){
		if(*it==c){
			pigcard[x].erase(it);
			return ;
		}
	}
}
void mopai(int x,int sum){
	cout<<x<<' '<<sum<<endl;
	For(i,1,sum){
		pigcard[x].push_back(card.front());
		sumcard[x][card.front()]++;
		if(card.size()>1){
			card.erase(card.begin());
		}
	}
	print();
}
void die(int killer,int x){
	live[x]=0;
	nxt[prv[x]]=nxt[x];
	prv[nxt[x]]=prv[x];
	if(pig[x]==1){
		game=1;
		return ;
	}else if(pig[x]==2){
		if(pig[killer]==1){
			pigcard[killer].clear();
			For(i,0,255) sumcard[killer][i]=0;
			zgln[killer]=0;
		}
	}else{
		sumfp--;
		if(sumfp==0){
			game=2;
			return ;
		}
		mopai(killer,3);
	}
}
void neardeath(int killer,int x){
	if(sumcard[x]['P']>0){
		blood[x]++;
		qipai(x,'P');
	}else{
		die(killer,x);
	}
}
void attack(int killer,int x){
	cout<<killer<<" ATTECK "<<x<<endl;
	blood[x]--;
	if(pig[x]==1&&jump[killer]==0) think[killer]=1;
	if(blood[x]==0){
		neardeath(killer,x);
	}
}
int Fpos(int x){
	int y=nxt[x];
	while(y!=x){
		if(biaodiyi(x,y,1)){
			return y;
		}
		y=nxt[y];
	}
	return -1;
}
void chupai(int x){
	while(1){
		if(game!=-1||!live[x]) return ;
		bool flag=0,usedK=0;
		for(char c:pigcard[x]){
			if(c=='K'){
				if((!usedK||zgln[x])&&biaodiyi(x,nxt[x],0)){
					qipai(x,'K');
					usedK=1;
					if(sumcard[nxt[x]]['D']>0){
						qipai(nxt[x],'D');
					}else{
						attack(x,nxt[x]);
						if(game!=-1) return ;
					}
					flag=1;
					break;
				}
			}else if(c=='P'){
				if(blood[x]<4){
					qipai(x,'P');
					blood[x]++;
					flag=1;
					break;
				}
			}else if(c=='D'){
				continue;
			}else if(c=='F'){
				int y=Fpos(x);
				if(y==-1){
					continue;
				}
				qipai(x,'F');
				if(pig[x]==1&&pig[y]==2){
					attack(x,y);
					flag=1;
					break;
				}
				int now=y,ano=x;
				while(1){
					if(sumcard[now]['K']>0){
						qipai(now,'K');
					}else{
						attack(ano,now);
						if(game!=-1) return ;
						break;
					}
					swap(now,ano);
				}
				flag=1;
				break;
			}else if(c=='N'){
				qipai(x,'N');
				int y=nxt[x];
				while(y!=x){
					if(sumcard[y]['K']>0){
						qipai(y,'K');
					}else{
						attack(x,y);
						if(game!=-1) return ;
					}
					y=nxt[y];
				}
				flag=1;
				break;
			}else if(c=='W'){
				qipai(x,'W');
				int y=nxt[x];
				while(y!=x){
					if(sumcard[y]['D']>0){
						qipai(y,'D');
					}else{
						attack(x,y);
						if(game!=-1) return ;
					}
					y=nxt[y];
				}
				flag=1;
				break;
			}else if(c=='Z'){
				qipai(x,'Z');
				zgln[x]=1;
				flag=1;
				break;
			}else if(c=='J'){
				continue;
			}
		}
		print();
		if(!flag) break;
	}
}
int main(){
//	freopen("in.in","r",stdin);
//	freopen("out.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	For(i,1,n){
		string op;
		cin>>op;
		if(op=="MP") pig[i]=1,jump[i]=1;
		else if(op=="ZP") pig[i]=2;
		else pig[i]=3,sumfp++;
		For(j,1,4){
			char c;
			cin>>c;
			pigcard[i].push_back(c);
			sumcard[i][c]++;
		}
		nxt[i]=i%n+1;
		prv[nxt[i]]=i;
		live[i]=1;
		blood[i]=4;
	}
	For(i,1,m){
		char c;
		cin>>c;
		card.push_back(c);
	}
	int now=1;
	while(game==-1){
		if(live[now]){
			mopai(now,2);
			chupai(now);
		}
		now=nxt[now];
	}
	if(game==1){
		cout<<"FP"<<endl;
	}else{
		cout<<"MP"<<endl;
	}
	For(i,1,n){
		if(!live[i]) cout<<"DEAD"<<endl;
		else{
			if(!pigcard[i].empty()){
				for(char ch:pigcard[i]){
					cout<<ch<<' ';
				}
			}
			cout<<endl;
		}
	}
	return 0;
}
2025/8/30 18:14
加载中...