学术没人解P2482
  • 板块灌水区
  • 楼主stylus
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/12 08:26
  • 上次更新2024/7/12 10:14:01
查看原帖
学术没人解P2482
836448
stylus楼主2024/7/12 08:26

@Goawaynotgg不会再回来了

wall leg 0分啊

cpp:

#include<bits/stdc++.h>
using namespace std;
struct pig{string name,s;int b,p,nt,lt,mp;bool zp;}a[11];
int n,m,fb,hp,fd;
string __;
map<string,string>mp;
//print()&pt()用来检查。
void pt(string s,int i,int x){//流程。
	if(mp[s]=="闪"||mp[s]=="桃"||mp[s]=="南猪入侵"||mp[s]=="万箭齐发"||mp[s]=="无懈可击"||mp[s]=="猪哥连弩"){
		cout<<i<<"号"<<a[i].name<<"使用了"<<mp[s]<<endl; 
	}else cout<<i<<"号"<<a[i].name<<"对"<<x<<"号"<<a[x].name<<"使用了"<<mp[s]<<endl;
	return;
}
void print(int i){//输出战局。
    cout<<"主猪的智慧:\n";
    for(int i=0;i<n;i++)cout<<(a[i].mp?(a[i].mp-1?"未知":"忠猪"):"反猪")<<' ';
    cout<<"\n身份:\n";
    for(int i=0;i<n;i++)cout<<(a[i].p?(a[i].p-1?"未知":"忠猪"):"反猪")<<' ';
	cout<<"\n出牌人:"<<i<<"号"<<a[i].name<<endl<<"目前局势:\n";
	for(int i=0;i<n;i++){
		cout<<a[i].name<<' '<<a[i].b<<' ';
		if(a[i].b<1)cout<<"DEAD\n";
		else cout<<a[i].s<<endl;
	}cout<<"牌堆:";
	for(int i=0;i<__.size();i++)cout<<__[i];
	cout<<endl<<endl;
	return;
}
void pc(int x,int i){//摸牌。
	while(i--){
		a[x].s+=__[0];
		if(__.size()>1)__.erase(0,1);
	}return;
}
void P(int x,int y){//桃。
	int i=a[x].s.find("P");
	while(i<a[x].s.size()&&a[x].b<4){
		a[x].s.erase(i,1),a[x].b++,i=a[x].s.find("P");
		if(!y&&a[x].b>0)return;
	}return;
}
bool die(int x,int y){//死了?
	if(a[y].b>0)return 0;
	P(y,0);
	if(a[y].b>0)return 0;
	a[a[y].lt].nt=a[y].nt,a[a[y].nt].lt=a[y].lt,hp--;
	if(a[y].name=="FP")pc(x,3),fd++;
	else if(a[x].name=="MP"&&a[y].name=="ZP")a[x].s.erase(0),a[x].zp=0;
	return 1;
}
int D(int x){//闪。
	int i=a[x].s.find("D");
	if(i>=a[x].s.size())return 1;
	a[x].s.erase(i,1);
	return 0;
}
bool K(int x){//出杀。
	int i=a[x].s.find("K");
	if(i>=a[x].s.size())return 1;
	a[x].s.erase(i,1);
	return 0;
}
void K_p(int x,int y,bool &tp){//杀人。
	while(!K(x)){
		a[y].b-=D(y);
        tp=1;
		if(die(x,y))return;
		if(!a[x].zp)break;
	}return;
}
bool J(int x){//无懈可击。
	int i=a[x].s.find("J");
	if(i>=a[x].s.size())return 0;
	a[x].s.erase(i,1);
	return 1;
}
bool ok(int x){//献殷勤。
	if(a[x].p==-1)return 0;
	if(!a[x].p){
		for(int i=0,j=0;j<hp;j++,i=a[i].nt){
			if(a[i].name=="FP"&&J(i)){
				a[i].p=0,a[i].mp=0;
				return 1;
			}
		}return 0;
	}for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if((a[i].name=="MP"||a[i].name=="ZP")&&J(i)){
			a[i].p=1,a[i].mp=1;
			return 1;
		}
	}return 0;
}
void F(int x,int y){//决斗。
	if(a[x].name=="MP"&&a[y].name=="ZP"){
		a[y].b--;
		return;
	}if(ok(y))return;
	while(1){
		if(K(y)){
			a[y].b--,die(x,y);
			return;
		}if(K(x)){
			a[x].b--,die(y,x);
			return;
		}
	}return;
}
void N(int x){//南猪入侵。
	for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if(ok(i)||i==x)continue;
		if(!K(i))continue;
		if(!i&&a[x].p==-1)a[x].mp=0;
		a[i].b--,die(x,i);
	}return;
}
void W(int x){//万箭齐发。
	for(int i=0,j=0;j<hp;j++,i=a[i].nt){
		if(ok(i)||i==x)continue;
		if(!D(i))continue;
		if(!i&&a[x].p==-1)a[x].mp=0;
		a[i].b--,die(x,i);
	}return;
}
void N_or_W(int x){//有没有上面两个。
	int i=a[x].s.find("N");
	while(i<a[x].s.size())a[x].s.erase(i,1),N(x),i=a[x].s.find("N");
	i=a[x].s.find("W");
	while(i<a[x].s.size())a[x].s.erase(i,1),W(x),i=a[x].s.find("W");
	return;
}
void pk1(int x,int y){//表敌意:杀。
    bool tp=0;
	K_p(x,y,tp);
    if(tp&&x)a[x].p=a[x].mp=!a[y].p;
    return;
}
void pk2(int x,int y){//表敌意:决斗。
    bool tp=0;
    if(tp&&x)a[x].p=a[x].mp=!a[y].p;
	int i=a[x].s.find("F");
	while(i<a[x].s.size()&&a[y].b>0)a[x].s.erase(i,1),F(x,y),i=a[x].s.find("F"),tp=1;
    return;
}
void pZ(int x){//装备。
	int i=a[x].s.find("Z");
	while(i<a[x].s.size())a[x].s.erase(i,1),a[x].zp=1,i=a[x].s.find("Z");
	return;
}
void ed(){//结局。
	cout<<(a[0].b>0?"MP\n":"FP\n");
	for(int i=0;i<n;i++){
		if(a[i].b<1)cout<<"DEAD\n";
		else{
			for(int j=0;j<a[i].s.size();j++)cout<<a[i].s[j]<<' ';
			cout<<endl;
		}
	}return;
}
void game(){//游戏。
	while(1){
		for(int i=0,j=0;j<hp;j++,i=a[i].nt){
			pc(i,2),P(i,1),pZ(i);//摸牌,吃桃,装备。
			if(!i){//主猪出牌。
				N_or_W(i);
				if(!a[a[i].nt].mp||!a[a[i].nt].p){
					pk1(i,a[i].nt);
					die(i,a[i].nt);
				}
                for(int k=0,l=0;l<hp;l++,k=a[k].nt){
                    if(i==k||a[k].p&&a[k].mp)continue;
                    pk2(i,k);
                    break;
                }
			}
			else if(a[i].name=="ZP"){//忠猪出牌。
			N_or_W(i);
			if(!a[a[i].nt].p){
				pk1(i,a[i].nt);
				die(i,a[i].nt);
			}
            for(int k=0,l=0;l<hp;l++,k=a[k].nt){
                if(i==k||a[k].p)continue;
                    pk2(i,k);
                    break;
                }
            }
			else{//反猪出牌。
			N_or_W(i);
            if(a[a[i].nt].p==1){
				pk1(i,a[i].nt);
				die(i,a[i].nt);
			}
            pk2(i,0);
			}
			if(a[0].b<1||fd>=fb){//结束。
				ed();
				return;
			}
		}
	}return;
}
int main(){//开始。
	mp["D"]="闪",mp["F"]="决斗",mp["P"]="桃",mp["K"]="杀",mp["N"]="南猪入侵",mp["W"]="万箭齐发",mp["J"]="无懈可击",mp["Z"]="猪哥连弩";
	cin>>n>>m,hp=n;
	for(int i=0;i<n;i++){
		cin>>a[i].name,a[i].p=a[i].mp=(!i?1:-1);
		getline(cin,a[i].s);
		while(a[i].s.find(" ")<a[i].s.size())a[i].s.erase(a[i].s.find(" "),1);
		a[i].s,a[i].b=4,fb+=(a[i].name=="FP"),a[i].lt=(i+n-1)%n,a[i].nt=(i+1)%n;
	}getline(cin,__);
	while(__.find(" ")<__.size())__.erase(__.find(" "),1);
	game();
  	return 0;
}
2024/7/12 08:26
加载中...