注意反猪^(* ̄(oo) ̄)^索敌
查看原帖
注意反猪^(* ̄(oo) ̄)^索敌
917820
hjr0418楼主2025/6/20 13:15
#include<bits/stdc++.h>
//#include<windows.h>
#define int long long
#define db long double
#define Pii pair<int,int>
#define fi first
#define se second
#define swap(x,y) x^=y^=x^=y
#define f(x,y) fixed<<setprecision(y)<<x
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,rp,stdin),p1==p2)?EOF:*p1++)

using namespace std;
const int N=2e3+10;
const int rp=1e6+10;

int n,m,top;
struct node{
	int q,hp,tiao,dead;
	//q 1主 2忠 3反
	//tiao 0未跳/主 1跳忠 2跳反 3类反
	//dead 0活 1亖 
	int z;
	vector<int> vt;
}p[15];
string s[N];
char buf[rp],*p1=buf,*p2=buf;

inline int read() 
{
	int x=0,f=1; char c=0;
    while(!isdigit(c)){if(c=='-') f=-1; c=gc();}
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=gc();
    return x*f;
}

inline char read_ch()
{
	char c=0;
	while(!isalpha(c)) c=gc();
	return c;
}

void jieshu()
{
	int qwq;
	for(int i=1;i<=n;++i)
	{
		if(p[i].dead) cout<<"DEAD\n";
		else 
		{
			for(int j=0;j<p[i].vt.size();++j)
			{
				qwq=p[i].vt[j];
				if(qwq==1) cout<<"P ";
				else if(qwq==2) cout<<"K ";
				else if(qwq==3) cout<<"D ";
				else if(qwq==4) cout<<"F ";
				else if(qwq==5) cout<<"N ";
				else if(qwq==6) cout<<"W ";
				else if(qwq==7) cout<<"J ";
				else if(qwq==8) cout<<"Z ";
			}
			cout<<"\n";
		}
	}
	exit(0);
}

void napai(int x,int a)
{
//	if(a) cerr<<"napai "<<x<<" "<<s[a]<"\n";
	if(s[a]=="P") p[x].vt.push_back(1);
	else if(s[a]=="K") p[x].vt.push_back(2);
	else if(s[a]=="D") p[x].vt.push_back(3);
	else if(s[a]=="F") p[x].vt.push_back(4);
	else if(s[a]=="N") p[x].vt.push_back(5);
	else if(s[a]=="W") p[x].vt.push_back(6);
	else if(s[a]=="J") p[x].vt.push_back(7);
	else if(s[a]=="Z") p[x].vt.push_back(8);
}

int xia(int x)
{
	for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
		if(!p[i].dead) return i;
}

int shang(int x)
{
	for(int i=(x==1?n:x-1);i!=x;i=(i==1?n:i-1))
		if(!p[i].dead) return i;
}

int find(int x)
{
	if(p[x].q==3) return 1;
	for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
	{
		if(!p[i].dead) 
		{
			if(p[x].q==1&&p[i].tiao>=2) return i;
			if(p[x].q==2&&p[i].tiao==2) return i;
		}
	}
	return 0;
}

void binsi(int x,int y)
{
//	cerr<<"binsi "<<x<<' '<<y<<"\n";
	for(int i=0;i<p[y].vt.size();++i)
	{
		if(p[y].vt[i]==1) ++p[y].hp,p[y].vt.erase(p[y].vt.begin()+i),--i;
		if(p[y].hp>0) return;
	}
	p[y].dead=1; p[y].vt.clear(); p[y].z=0;
	if(p[y].q==1) 
	{
		cout<<"FP\n";
		jieshu(); 
	}
	if(p[y].q==3) 
	{
		bool flag=1;
		for(int i=1;i<=n;++i)
			if(p[i].q==3&&p[i].dead==0) flag=0;
		if(flag) cout<<"MP\n",jieshu();
		for(int ttt=1;ttt<=3;ttt++)if(top==m) napai(x,top); else napai(x,++top);
	}
	if(p[x].q==1&&p[y].q==2)
	{
		p[x].vt.clear(); p[x].z=0;
	}
}

void biaodi(int x,int y)
{
	if(p[x].q==1||p[x].tiao==1||p[x].tiao==2) return;
	if(p[y].tiao==1||p[y].q==1) p[x].tiao=2;
	if(p[y].tiao==2) p[x].tiao=1;
}

void xianyin(int x,int y)
{
	if(p[x].q==1||p[x].tiao==1||p[x].tiao==2) return;
	if(p[y].tiao==1||p[y].q==1) p[x].tiao=1;
	if(p[y].tiao==2) p[x].tiao=2;
}

int find_wx(int x)
{
	for(int i=0;i<p[x].vt.size();++i)
		if(p[x].vt[i]==7) return i;
	return 114514;
}

bool ask_wx(int x,int y,int a)
{
	if(!(p[y].tiao==1||p[y].tiao==2||p[y].q==1)) return 1;
	#define qi p[i].vt.erase(p[i].vt.begin()+a)
	bool qwq=1;
	while(1)
	{
		bool flag=0;
		for(int i=a,j=1;j<=n;i=(i==n?1:i+1),++j)
		{
			if(p[i].dead) continue;
			int a=find_wx(i);
			if(a==114514) continue;
			if(qwq)
			{
				if(p[i].q==1&&(p[y].tiao==1||y==1)) qi,qwq=0;
				else if(p[i].q==2&&(p[y].tiao==1||y==1)) qi,qwq=0;
				else if(p[i].q==3&&p[y].tiao==2) qi,qwq=0;
				else if(p[i].q==1&&p[x].tiao>=2) qi,qwq=0;
				else if(p[i].q==2&&p[x].tiao==2) qi,qwq=0;
				else if(p[i].q==3&&(p[x].q==1||p[x].tiao==1)) qi,qwq=0;
				if(!qwq) xianyin(i,y),biaodi(i,x),flag=1;
			}
			else
			{
				if(p[i].q==1&&(p[x].tiao==1||x==1)) qi,qwq=1;
				else if(p[i].q==2&&(p[x].tiao==1||x==1)) qi,qwq=1;
				else if(p[i].q==3&&p[x].tiao==2) qi,qwq=1;
				else if(p[i].q==1&&p[y].tiao>=2) qi,qwq=1;
				else if(p[i].q==2&&p[y].tiao==2) qi,qwq=1;
				else if(p[i].q==3&&(p[y].q==1||p[y].tiao==1)) qi,qwq=1;
				if(qwq) xianyin(i,x),biaodi(i,y),flag=1;
			}
		}
		if(!flag) break;
	}
	#undef qi
	return qwq;
}

void sha(int x,int y)
{
//	cerr<<"sha "<<x<<" "<<y<<"\n";
	biaodi(x,y);
	for(int i=0;i<p[y].vt.size();++i)
		if(p[y].vt[i]==3) 
			{p[y].vt.erase(p[y].vt.begin()+i); return;}
	--p[y].hp;
	if(p[y].hp<=0) binsi(x,y);
}

void jd(int x,int y)
{
//	cerr<<"jd "<<x<<" "<<y<<"\n";
	biaodi(x,y);//x对y表敌意 
	if(!ask_wx(x,y,x)) return;
	if(p[x].q==1&&p[y].q==2) 
	{
		--p[y].hp;
		if(p[y].hp<=0) binsi(x,y);
		return;
	}
	bool flag;
	for(int i=1;;++i)
	{
		flag=0;
		if(i&1)
		{
			for(int i=0;i<p[y].vt.size();++i)
				if(p[y].vt[i]==2) 
				{
					p[y].vt.erase(p[y].vt.begin()+i);
					flag=1; break;
				}		
			if(!flag) 
			{
				--p[y].hp; if(p[y].hp<=0) binsi(x,y);
				return;
			}
		}
		else
		{
			for(int i=0;i<p[x].vt.size();++i)
				if(p[x].vt[i]==2) 
				{
					p[x].vt.erase(p[x].vt.begin()+i);
					flag=1; break;
				}
			if(!flag) 
			{
				--p[x].hp; if(p[x].hp<=0) binsi(y,x);
				return;
			}		
		}
	}
}

void nanm(int x)
{
//	cerr<<"nanm"<<" "<<x<<"\n";
	for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
	{
		bool flag=0;
		if(p[i].dead) continue;
		if(!ask_wx(0,i,x)) continue;
		for(int j=0;j<p[i].vt.size();++j)
			if(p[i].vt[j]==2) 
			{
				p[i].vt.erase(p[i].vt.begin()+j); 
				flag=1; break;
			}
		if(!flag) 
		{
			--p[i].hp; 
			if(p[i].q==1&&!p[x].tiao) p[x].tiao=3;
			if(p[i].hp<=0) binsi(x,i);
		}
	}
}

void wanj(int x)
{
//	cerr<<"wanj"<<" "<<x<<"\n";
	for(int i=(x==n?1:x+1);i!=x;i=(i==n?1:i+1))
	{
		bool flag=0;
		if(p[i].dead) continue;
		if(!ask_wx(0,i,x)) continue;
		for(int j=0;j<p[i].vt.size();++j)
			if(p[i].vt[j]==3) 
			{
				p[i].vt.erase(p[i].vt.begin()+j); 
				flag=1; break;
			}
		if(!flag) 
		{
			--p[i].hp; 
			if(p[i].q==1&&!p[x].tiao) p[x].tiao=3;
			if(p[i].hp<=0) binsi(x,i);
		}
	}
}

void huihe(int x)
{
	#define qi p[x].vt.erase(p[x].vt.begin()+i),i=-1
//	cerr<<"huihe "<<x<<"\n";
	if(p[x].dead) return; bool flag=0;
	for(int ttt=1;ttt<=2;ttt++)if(top==m) napai(x,top); else napai(x,++top);
	for(int i=0;i<p[x].vt.size();++i)
	{
		int v=p[x].vt[i];
		if(v==1) {if(p[x].hp<4) qi,++p[x].hp;}
		else if(v==2&&(flag==0||p[x].z==1))
		{
			if(p[x].q==1)
			{
				if(p[xia(x)].tiao>1) qi,sha(x,xia(x)),flag=1;
			}
			else if(p[x].q==2)
			{
				if(p[xia(x)].tiao==2) qi,sha(x,xia(x)),flag=1;
			}
			else
			{
				if(p[xia(x)].q==1||p[xia(x)].tiao==1) qi,sha(x,xia(x)),flag=1;//此行sha(x,xia(x))绝不能写为sha(x,1),会导致反猪隔山打牛,穿越攻击
			}
		}
		else if(v==4)
		{
			int y=find(x);
			if(y!=0) qi,jd(x,y);
			if(p[x].dead) return;
		}
		else if(v==5) qi,nanm(x);
		else if(v==6) qi,wanj(x);
		else if(v==8) qi,p[x].z=1;
		else ;
	}
//	cerr<<"\n";
//	for(int i=1;i<=n;++i)
//		cerr<<i<<" "<<p[i].hp<<"\n";
//	Sleep(500);
}

signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)
	{
		cin>>s[0]; p[i].hp=4;
		if(s[0]=="MP") p[i].q=1;
		else if(s[0]=="ZP") p[i].q=2;
		else p[i].q=3;
		for(int j=0;j<=3;++j) cin>>s[0],napai(i,0);
	}
	for(int i=1;i<=m;++i) cin>>s[i];
	while(1) for(int i=1;i<=n;++i) huihe(i);
	return 0;
}
2025/6/20 13:15
加载中...