求助
查看原帖
求助
576669
_czk_楼主2023/8/22 18:05
#include<bits/stdc++.h>
#define debug puts("114514")
using namespace std;
int diff[3][3]={{0,0,1},{0,0,1},{1,1,0}};
int n,m,fanzhu=0,sifan=0,rounds,temp[2005],used[2005];
struct Pig{
	char card[2005];
	int kind;
	int hp=4;
	int pre;
	int nxt;
	int dead;
	int eq;
	int cnt=4;
}pig[15];//猪 
deque<char> card_heap;//牌堆 
void input(){
	string s;
	cin>>n>>m;
	fanzhu=sifan=0;
	for(int i=1;i<=n;i++){
		int lst=0;
		pig[i].nxt=i%n+1;
		cin>>s;
		if(s=="FP")
			fanzhu++;
		pig[i].kind=(s!="FP")?((s!="ZP")?0:1):2;
		for(int j=1;j<=4;j++){
			cin>>pig[i].card[j]; 
		}//初始手牌 
	}
	pig[1].pre=1;
	for(int i=1;i<=m;i++){
		char x;
		cin>>x;
		card_heap.push_back(x);
	}//牌堆读入
}//输入
void get_card(int x){
	pig[x].card[++pig[x].cnt]=card_heap.front();
	if(card_heap.size()>1)
		card_heap.pop_back();
}//摸牌
bool jg(int x){
	int nxt=pig[x].nxt;
	if(pig[nxt].pre==0)return 0;
	else if(pig[nxt].pre==1)
		return diff[pig[x].kind][pig[nxt].kind];
	else
		return pig[x].kind==0;
}//判断种类 
int atk(int x){
	if(pig[x].kind==2)return 1;
	for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
		if(pig[i].dead)continue;
		if((pig[i].kind==2&&pig[i].pre==1)||(pig[x].kind==0&&pig[i].pre==-1))
			return i;
	}
	return -1;
}//行动 
void pend(int x,int y){
	if(pig[x].kind==0&&pig[y].kind==1){
		for(int i=1;i<=pig[x].cnt;i++){
			used[i]=rounds;
			pig[x].eq=0;
		}
	}
	else if(pig[y].kind==2){
		for(int i=0;i<3;i++)
			get_card(x);
	}
}//死猪了 
int find(int x,char y){
	for(int i=1;i<=pig[x].cnt;i++){
		if(pig[x].card[i]==y)
			return i;
	}
	return 0;
}//找牌
void move(int x,int y,int z){
	for(int i=y;i<z;i++)
		pig[x].card[i]=pig[x].card[i+1];
}//移牌 
void r_peach(int x,int y){
	int z=find(x,'P');
	if(x==y){
		z=0;
		for(int i=1;i<=pig[x].cnt;i++)
			if(used[i]!=rounds&&pig[x].card[i]=='P'){
				z=i;
				break;
			}
		if(z)used[x]=rounds,pig[x].hp++;
		return;
	}
	if(z){
		pig[x].hp++;
		move(x,z,pig[x].cnt);
		pig[x].cnt--;
	}
}//被动桃
bool r_dodge(int x){
	int z=find(x,'D');
	if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
	return z;
}//被动闪 
bool r_kill(int x,int y){
	int z=find(x,'K');
	if(x==y){
		z=0;
		for(int i=1;i<=pig[x].cnt;i++)
			if(used[i]!=rounds&&pig[x].card[i]=='K'){
				z=i;
				break;
			}
		if(z)used[x]=rounds;
		return z;
	}
	if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
	return z;
}//被动杀
bool r_wuxiekeji(int x,int y){
	int z=find(x,'J');
	if(x==y){
		z=0;
		for(int i=1;i<=pig[x].cnt;i++)
			if(used[i]!=rounds&&pig[x].card[i]=='J'){
				z=i;
				break;
			}
		if(z)used[x]=rounds;
		return z;
	}
	if(z)move(x,z,pig[x].cnt),pig[x].cnt--;
	return z;
}//被动无懈可击 
void lose_hp(int x,int y){
	pig[x].hp--;
	if(pig[x].hp<=0)
		r_peach(x,y);
}//扣血
void ilink(int x){
	for(int i=1;i<=n;i++)
		if(!pig[i].dead&&pig[i].nxt==x){
			pig[i].nxt=pig[x].nxt;
			break;
		}
}//改链
void peach(int x){
	pig[x].hp++;
}//桃
void kill(int x){
	int nxt=pig[x].nxt;
	pig[x].pre=1;
	if(!r_dodge(nxt)){
		lose_hp(nxt,x);
		if(pig[nxt].hp<=0){
			if(pig[nxt].kind==2)++sifan;
			pig[nxt].dead=1;
			pig[x].nxt=pig[nxt].nxt;
		}
		if(fanzhu==sifan||pig[1].dead)
			return;
		if(pig[nxt].hp<=0)
			pend(x,nxt);
	}
}//杀
bool wuxiekeji(int x,int y,int z,int w){
	bool ret=w;
	for(int i=x;;){
		if(!pig[i].dead){
			if(!w){
				if(!diff[pig[i].kind][pig[z].kind]){
					if(r_wuxiekeji(i,x)){
						pig[i].pre=1;
						return wuxiekeji(x,i,z,1-w);
					}
				}
			}
			else{
				if(diff[pig[i].kind][pig[z].kind]){
					if(r_wuxiekeji(i,x)){
						pig[i].pre=1;
						return wuxiekeji(x,i,z,1-w);
					}
				}
			}
			i=pig[i].nxt;
			if(i==y)
				break;
		}
	}
	return ret;
}//无懈可击 
void fight(int x,int y,int z){
	pig[x].pre=1;
	if(pig[y].pre==1)
		if(wuxiekeji(x,x,y,0))
			return;
	for(;;){
		if(pig[x].kind==0&&pig[y].kind==1){
			lose_hp(y,z);
			if(pig[y].hp<=0){
				if(pig[y].kind==2)sifan++;
				pig[y].dead=1;
				ilink(y);
			}
			if(fanzhu==sifan||pig[1].dead)return;
			if(pig[y].hp<=0)pend(x,y);
			return;
		}
		else if(!r_kill(y,z)){
			lose_hp(y,z);
			if(pig[y].hp<=0){
				if(pig[y].kind==2)++sifan;
				pig[y].dead=1;
				ilink(y);
			}
			if(fanzhu==sifan||pig[1].dead)return;
			if(pig[y].hp<=0)pend(x,y);
			return;	
		}
		if(!r_kill(x,z)){
			lose_hp(x,z);
			if(pig[x].hp<=0){
				if(pig[x].kind==2)++sifan;
				pig[x].dead=1;
				ilink(x);
			}
			if(fanzhu==sifan||pig[1].dead)return;
			if(pig[x].hp<=0)pend(y,x);
			return;	
		}	
	}
}//决斗
void nanzhuruqing(int x){
	for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
		if(pig[i].dead)continue;
		if(pig[i].pre==1)
			if(wuxiekeji(x,x,i,0))
				continue;
		if(!r_kill(i,x)){
			lose_hp(i,x);
			if(i==1&&pig[x].pre==0)
				pig[x].pre=-1;
			if(pig[i].hp<=0){
				if(pig[i].kind==2)++sifan;
				pig[i].dead=1;
				ilink(i);
			}
			if(fanzhu==sifan||pig[1].dead)return;
			if(pig[i].hp<=0)pend(x,i);
		}
	} 
}//南猪入侵
void wanjianqifa(int x){
	for(int i=pig[x].nxt;i!=x;i=pig[i].nxt){
		if(pig[i].dead)continue;
		if(pig[i].pre==1)
			if(wuxiekeji(x,x,i,0))
				continue;
		if(!r_dodge(i)){
			lose_hp(i,x);
			if(i==1&&pig[x].pre==0)
				pig[x].pre=-1;
			if(pig[i].hp<=0){
				if(pig[i].kind==2)++sifan;
				pig[i].dead=1;
				ilink(i);
			}
			if(fanzhu==sifan||pig[1].dead)return;
			if(pig[i].hp<=0)pend(x,i);
		}
	} 
}//万箭齐发
void zhugeliannu(int x){
	pig[x].eq=1;
}//诸葛连弩
bool use_card(int x){
	memset(used,0,sizeof(used));
	int i,cntused,cntkill=0,counts,ret=-1,y;
	char nw;
	for(rounds=1;;rounds++){
		cntused=counts=0;
		for(i=1;i<=pig[x].cnt;i++){
			if(used[i]!=rounds){
				nw=pig[x].card[i];
				switch(nw){
                case 'P':
                    if(pig[x].hp<4)
						peach(x),used[i]=rounds,cntused++,i=pig[x].cnt;
                    break;
                case 'K':
                    if((!cntkill||pig[x].eq)&&jg(x))
						kill(x),used[i]=rounds,cntused++,cntkill++,i=pig[x].cnt;
                    break;
                case 'F':
                    y=atk(x);
					if(y!=-1)
						fight(x,y,x),used[i]=rounds,cntused++,i=pig[x].cnt;
                    break;
                case 'N':
                    nanzhuruqing(x),used[i]=rounds,cntused++,i=pig[x].cnt;
                    break;
                case 'W':
                    wanjianqifa(x),used[i]=rounds,cntused++,i=pig[x].cnt;
                    break;
                case 'Z':
                    zhugeliannu(x),used[i]=rounds,cntused++,i=pig[x].cnt;
                    break;
                default:
                    break;
            	}
            	if(fanzhu==sifan||pig[1].dead){
					ret=1;
					break;
				}
				if(pig[x].dead){
					ret=0;
					break;
				}
			}
		}
		for(int i=1;i<=pig[x].cnt;i++)
			if(used[x]!=rounds)
				temp[++counts]=pig[x].card[i];
		for(int i=1;i<=counts;i++)
				pig[x].card[i]=temp[i];
		if(!cntused&&ret!=-1)
			ret=0;
		if(ret>-1)
			return ret;
	}
}//使用手牌 
bool play(int x){
	get_card(x);
	get_card(x);
	return use_card(x);
}
void d(){
	for(int i=1,e=0;!e&&fanzhu>0;i=pig[i].nxt)
		if(!pig[i].dead)
			e=play(i);
}
void print(){
	if(pig[1].dead)
		puts("FP");
	else
		puts("MP");
	for(int i=1;i<=n;i++){
		if(pig[i].dead){
			puts("DEAD");
			continue;
		}
		if(pig[i].cnt>=1)
			cout<<pig[i].card[1];
		for(int j=2;j<=pig[i].cnt;j++)
			cout<<" "<<pig[i].card[j];
		puts("");
	}
}//输出 
int main(){
	input();
	d();
	print();
	return 0;
}
2023/8/22 18:05
加载中...