玄关求调,都改到和tj差不多完全一样了。
查看原帖
玄关求调,都改到和tj差不多完全一样了。
741314
signed_long_long楼主2024/10/15 20:39

0pts

#include<bits/stdc++.h>
//------------------------------//
using namespace std;
#define a p
#define perfo purfo
int n,m,shengdefan,rounds,sidefan,ret;
bool diff[3][3]={{0,0,1},{0,0,1},{1,1,0}};
int tmp[2080];
int use[2080];
bool youzhu=true;
deque<char>paidui;
struct pig{
	int zhenyin;
	int tili,next,die,paishu=4;
	int tiao=0;//-1是反,0是还没跳,1是忠 
	int lei=0;//同上 
	int purfo;int zhuangbei;
	char pai[2080];
}p[11];

void shan(int x,int start,int over){
	for(int i=start;i<over;i++){
		a[x].pai[i]=a[x].pai[i+1];
	}
}
int find(int x,char need){
	for(int i=1;i<=a[x].paishu;i++){
		if(a[x].pai[i]==need) return i;
	}
	return 0;
}
void chutao(int x,int user){
	int re=find(x,'P');
	if(x==user){
		re=0;
		for(int i=1;i<=a[x].paishu;i++){
			if(use[i]!=rounds and a[x].pai[i]=='P'){
				re=i;
				break;
			}
		}
		if(re) use[re]=rounds,a[x].tili++;
		return;
	}
	if(re) a[x].tili++,shan(x,re,a[x].paishu),a[x].paishu--;
}
void diaoxue(int x,int user){
	a[x].tili--;
	if(a[x].tili<1){
		chutao(x,user);
	}
}
void input(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		a[i].tili=4;
		a[i].die=a[i].perfo=a[i].zhuangbei=0;
		string s;
		cin>>s;
		if(s=="FP") a[i].zhenyin=2;
		else if(s=="MP") a[i].zhenyin=0;
		else if(s=="ZP") a[i].zhenyin=1;
		for(int j=1;j<=4;j++){
			cin>>p[i].pai[j];
		}
		p[i].next=i+1;
		if(i==n) p[i].next=1;
	}
	for(int i=1;i<=m;i++){
		char ch;
		cin>>ch;
		paidui.push_back(ch);
	}
}
bool chushan(int x){
	int re=find(x,'D');
	if(re>0){
		shan(x,re,a[x].paishu--);
		return true;
	}
	return false;
}
void dakill(int x){
	int next=a[x].next;
	a[x].purfo=1;
	if(!chushan(next)){
		a[next].tili--;
		if(a[next].tili<1) chutao(next,x);
		if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,a[x].next=a[next].next;
		if(shengdefan==sidefan or a[1].die) return;
		if(a[next].tili<1) {
			if(a[x].zhenyin==0 and a[next].zhenyin==1){
				for(int i=1;i<=a[x].paishu;i++) use[i]=rounds;
				a[x].zhuangbei=0;
			}
			else if(a[next].zhenyin==2){
				for(int q=1;q<=3;q++){
					p[x].pai[++p[x].paishu]=paidui.front();
					if(paidui.size()>1) paidui.pop_front();
				}
			}
		}
	}
}
bool chuwuxie(int x,int user){
	int re=find(x,'J');
	if(x==user){
		re=0;
		for(int i=1;i<=a[x].paishu;i++){
			if(use[i]!=rounds and a[x].pai[i]=='J'){
				re=i;
				break;
			}
		}
		if(re) use[re]=rounds;
		return re;
	}
	if(re) shan(x,re,a[x].paishu),a[x].paishu--;
	return re;
}
bool dawuxie(int user,int x,int aim,int now){
	bool ret=now;
	for(int next=x;;){
		if(!a[next].die){
			if(!now){
				if(!diff[a[next].zhenyin][a[aim].zhenyin]){
					if(chuwuxie(next,user)) {
					a[next].perfo=1;
					return dawuxie(user,next,aim,1-now);
				}
			}
			}else{
				if(diff[a[next].zhenyin][a[aim].zhenyin]){
					if(chuwuxie(next,user)){
						a[next].perfo=1;
						return dawuxie(user,next,aim,1-now);
					}
				}
			}
			next=a[next].next;
			if(next==x) break;
		}
	}
	return ret;
}
void changelink(int x){
	for(int pre=1;pre<=n;pre++){
		if(!a[pre].die and a[pre].next==x){
			a[pre].next=a[x].next;
			break;
		}
	}
}
void pend(int x,int y){
	if(a[x].zhenyin==0 and a[y].zhenyin==1){
		for(int i=1;i<=a[x].paishu;i++){
			use[i]=rounds;a[x].zhuangbei=0;
		}
	}else if(a[y].zhenyin==2){
		for(int q=1;q<=3;q++){
			p[x].pai[++p[x].paishu]=paidui.front();
			if(paidui.size()>1) paidui.pop_front();
		}
	}
}
bool chukill(int x,int user){
	int re=find(x,'D');
	if(re){
		shan(x,re,a[x].paishu),a[x].paishu--;
	}
	return re;
}
void dafight(int x,int aim,int user){
	a[x].perfo=1;
	if(a[aim].perfo==1){
		if(dawuxie(x,x,aim,0)) return;
	}
	for(;;){
		if(a[x].zhenyin==0 and a[aim].zhenyin==1){
			a[aim].tili--;
			if(a[aim].tili<1){
				chutao(aim,user);
			}
			if(a[aim].tili<1) sidefan+=(a[aim].zhenyin==2),a[aim].die=1,changelink(aim);
			if(shengdefan==sidefan or a[1].die) return;
			if(a[aim].tili<1) pend(x,aim);
			return;
		}else
		if(!chukill(aim,user)){
			diaoxue(aim,user);
			if(a[aim].tili<1) sidefan+=(a[aim].zhenyin==2),a[aim].die=1,changelink((aim));
			if(shengdefan==sidefan or a[1].die) return;
			if(a[aim].tili<1) pend(x,aim);
			return;
		}
		if(!chukill(x,user)){
			diaoxue(x,user);
			if(a[x].tili<1) sidefan+=(a[x].zhenyin==2),a[x].die=1,changelink(x);
			if(shengdefan==sidefan or a[1].die) return;
			if(a[x].tili<1) pend(aim,x);
			return;
		}
	}
}
void dananzhu(int x){
	for(int next=a[x].next;next!=x;next=a[next].next){
		if(!a[next].die){
			if(a[next].perfo==1){
				if(dawuxie(x,x,next,0)) continue;
			}
		}
		if(!chukill(next,x)){
			diaoxue(next,x);
			if(next==1 and a[x].perfo==0) a[x].perfo=-1;
			if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,changelink(next);
			if(shengdefan==sidefan or a[1].die) return;
			if(a[next].tili<1) pend(x,next);
		}
	}
}
int atk(int x){
	if(a[x].zhenyin==2) return 1;
	for(int next=a[x].next;next!=x;next=a[next].next){
		if(!a[next].die){
			if(a[next].zhenyin==2 and a[next].perfo==1 or a[x].zhenyin==0 and a[next].perfo==-1) return next;
		}
	}
	return -1;
}
bool ought(int x){
	int next=a[x].next;
	if(a[next].perfo==0) return 0;
	if(a[next].perfo==1) return diff[a[x].zhenyin][a[next].zhenyin];
	return a[x].zhenyin==0;
}
void dawanjian(int x){
	for(int next=a[x].next;next!=x;next=a[next].next){
		if(!a[next].die){
			if(a[next].perfo==1){
				if(dawuxie(x,x,next,0)) continue;
			}
			if(!chushan(next)){
				diaoxue(next,x);
				if(next==1 and a[x].perfo==0) a[x].perfo=-1;
				if(a[next].tili<1) sidefan+=(a[next].zhenyin==2),a[next].die=1,changelink((next));
				if(shengdefan==sidefan or a[1].die) return ;
				if(a[next].tili<1) pend(x,next);
			}
		}
	}
}
bool chupai(int x){
	memset(use,0,sizeof(use));
	int usepai=0,kill,ret=-1,counts;
	for(int rounds=1;;rounds++){
		for(int i=1;i<=p[x].paishu;i++){
			if(use[i]!=rounds){
	//--------
	char np;
	np=p[x].pai[i];
	if(np=='P') {
		if(a[x].tili<4) a[x].tili++,use[i]=rounds,usepai++,i=a[x].paishu;
}	else if(np=='K'){
		if((!kill or a[x].zhuangbei) and ought(x)) dakill(x),use[i]=rounds,usepai++,i=a[i].paishu;
	}else if(np=='F'){
		int aim=atk(x);
		if(aim!=-1){
			dafight(x,aim,x),use[i]=rounds,usepai++,i=a[x].paishu;
		}
	}else if(np=='N'){
		dananzhu(x);
		use[i]=rounds,usepai++,i=a[x].paishu;
	}else if(np=='W'){
		dawanjian(x);
		use[i]=rounds,usepai++,i=a[x].paishu;
	}else if(np=='Z'){
		a[x].zhuangbei=1;
		use[i]=rounds,usepai++,i=a[x].paishu;
	}
	//---------
	if(shengdefan==sidefan or a[1].die) {ret=1;break;}
	if(a[x].die){ret=0;break;}
			}
			for(int i=1;i<=a[x].paishu;i++) if(use[i]!=rounds) tmp[++counts]=a[x].pai[i];
			for(int i=1;i<=counts;i++) a[x].pai[i]=tmp[i];a[x].paishu=counts;
			if(!usepai and ret!=-1) ret=0;
			if(ret>-1) return ret; 
		}
	}
}
bool play(int x){
//下面是抽牌 
	for(int q=1;q<=2;q++){
		p[x].pai[++p[x].paishu]=paidui.front();
		if(paidui.size()>1) paidui.pop_front();
	}
//上面是抽牌
	return chupai(x);
}
signed main(){
	input();
	for(int i=1,event=0;!event and shengdefan>0 and youzhu;i=p[i].next){
		if(p[i].die==true) continue;
		event=play(i);
	}
	printf("%s\n",a[1].die?"FP":"MP");
	for(int i=1;i<=n;i++){
		if(a[i].die) printf("DEAD");
		else{
			if(a[i].pai>0){
				printf("%c",a[i].pai[1]);
			}
			for(int j=2;j<=a[i].paishu;j++) printf(" %c",a[i].pai[j]);
		}
		puts("");
	}
	return 0; 
}
2024/10/15 20:39
加载中...