RE
查看原帖
RE
1073741
UKE_bound楼主2024/11/11 12:18
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int n,m;//猪的数量和牌堆大小 
int ident[15];//**表明的**身份
//0:未表明身份
//1:忠(主)猪
//2:反猪
//3:类反猪 
bool life[15];//是否存活 
int freba;//存活的反猪数量
queue<char> pokerheap;//牌堆
char mp(void){
	char res=pokerheap.front();
	if(pokerheap.size()!=1){
		pokerheap.pop();
	}
	return res;
} 
bool southpig,tsarrow;//是否有未处理完的南猪入侵或万箭齐发
int spwho=-1 ,tsawho=-1;//发起南猪入侵或万箭齐发的猪 
class mainpigdie{
	public:
		mainpigdie(){}
		~mainpigdie(){}
	private:
		;
};
class frebaalldie{
	public:
		frebaalldie(){}
		~frebaalldie(){}
	private:
		;
};
class pig{//猪 
	public:
		pig(int Id=0,string l="",char a='a',char b='a',char c='a',char d='a'){
			id=Id;
			blood=4;
			kind=l[0];
			if(kind=='M')ident[id]=1;
			life[id]=1;
			start=0;
			pigbrother=0;
			alreadykill=0;
			poker.push_back(a);
			poker.push_back(b);
			poker.push_back(c);
			poker.push_back(d);
			number[a]++;
			number[b]++;
			number[c]++;
			number[d]++;
		}
		~pig(){}
		void mp(int num/*摸牌张数*/){
			while(num--){
				char t=::mp();
				poker.push_back(t);
				number[t]++;
			}
		}
		void cp(void);
		void printpoker(void){//打印手牌
			for(int i=start;i<poker.size();i++){
				if(poker[i]!='Q')cout<<poker[i];
			}
			cout<<endl;
		}
	private:
		void selfdie(int who);
		void delpoker(int i){//删除一张牌 
			number[poker[i]]--;
			poker[i]='Q';
			if(start==i)start++;
		}
		void delblood(int d,int who){
			blood-=d;
			if(number['P']+blood<=0)this->selfdie(who);//桃不够 
			number['P']=0;
			for(int i=start;i<poker.size();i++){
				if(poker[i]=='P')delpoker(i);
			}
		}
		void beingkill(int who){
			if(!number['D']){
				delblood(1,who);
				return;
			}
			for(int i=start;i<poker.size();i++){
				if(poker[i]=='D'){
					delpoker(i);
					break;
				}
			}
		}
		int id;//序号 
		char kind;//类型
		//M:主猪Z:忠猪F:反猪 
		bool pigbrother;//是否**装备**猪哥连弩 
		vector<char> poker;//手牌 
		//'Q'表示此处手牌已被使用
		int start;//第一张有效手牌位置
		map<char,int> number;
		//每一种牌的数量
		int blood;//体力 
		bool alreadykill;//是否已经在本回合出杀 
}pigs[15];
void pig::selfdie(int who){
	life[id]=0;
	if(kind=='M'){
		throw mainpigdie();
	}else if(kind=='F'){
		pigs[who].mp(3);
		freba--;
		if(!freba){
			throw frebaalldie();
		}
	}else{
		if(pigs[who].kind=='M'){
			pigs[who].poker=vector<char>();
			pigs[who].number=map<char,int>();
			pigs[who].start=0;
			pigs[who].pigbrother=0;
		}
	}
}
void pig::cp(void){
	for(int i=start;i<poker.size();i++){
		if(poker[i]=='D'||poker[i]=='J'||poker[i]=='Q')continue;//闪和无懈不能先手出 
		if(poker[i]=='P'){//桃 
			if(blood<4){
				blood++;
				poker[i]--;
				delpoker(i);
			}
		}else if(poker[i]=='K'){//杀 
			if(alreadykill&&!pigbrother)continue;//已经出杀,还没有诸葛连弩 
			if(kind=='M'){
				int j=id;
				for(;j!=id;j++){
					if(j==n+1)j=1;
					if(life[j])break;
				}
				if(ident[j]==2||ident[j]==3){
					delpoker(i);
					pigs[j].beingkill(id); 
				}
			}else if(kind=='Z'){
				int j=id;
				for(;j!=id;j++){
					if(j==n+1)j=1;
					if(life[j])break;
				}
				if(ident[j]==2){
					delpoker(i);
					pigs[j].beingkill(id); 
				}
			}else if(kind=='F'){
				int j=id;
				for(;j!=id;j++){
					if(j==n+1)j=1;
					if(life[j])break;
				}
				if(ident[j]==1){
					delpoker(i);
					pigs[j].beingkill(id); 
				}
			}
		}else if(poker[i]=='Z'){
			pigbrother=1;
			delpoker(i);
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		string s;
		char a,b,c,d;
		cin>>s>>a>>b>>c>>d;
		pigs[i]=pig(i,s,a,b,c,d);
	}
	for(int i=1;i<=m;i++){
		char t;
		cin>>t;
		pokerheap.push(t);
	}
	try{
		for(int i=1;;i++){
			if(i==n+1)i=1;
			if(!life[i])continue; 
			pigs[i].mp(2);
			pigs[i].cp();
		}
	}catch(mainpigdie& m){
		cout<<"FP";
	}catch(frebaalldie& f){
		cout<<"MP";
	}
	for(int i=1;i<=n;i++){
		if(!life[i]){
			cout<<"DEAD\n";
			continue;
		}
		pigs[i].printpoker();
	}
	return 0;
}
/*
3 10
MP Z K K D
ZP Z K K K
FP K K K P
K K D D Z Z P D K K
*/

自测数据:

2 5
MP Z K K K
FP Z Z Z Z
K P K Z K

刚把主猪的牌输入完,就不接受输入了,过一会儿异常结束。

2024/11/11 12:18
加载中...