P2482 猪国杀 求助修改灵感
  • 板块题目总版
  • 楼主X_X_M
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/7/20 14:50
  • 上次更新2023/10/27 19:19:22
查看原帖
P2482 猪国杀 求助修改灵感
363149
X_X_M楼主2022/7/20 14:50

这道题磕了1天,终于死磕出来个30分QWQ(而且我第六个数据点还没过,过的是前五个和后面的一个

求助大佬们这道题容易注意不到的点,在下面告诉我就行

评测数据

以下是代码

#include <bits/stdc++.h>
using namespace std;

struct node{
	string sf;
	bool die,zgln;
	char p[4000];
	int pl,xue_liang,zui_jin_chao_feng;
	bool lf[30];
	bool tiaobutiao;
};

int n,m,mp,sff[30],shi_yong_zhe,zhu,zhong,zhong_past,fan,fan_past,other,chuandi=0;
short ans,fff=0,kkk520=0;
queue <int>nanzhu;
queue <char>pd1;
node pigs[30];
short ysys;
char xcv;
bool af;

void zx(string sj,int num,int player);
short xxx(int player,string sf);
bool pd(string sj,int player);
int ask(string x,int player);
void binsi(int player);
short cp(int player);
int ssl(int player);
void js();

void js(){
	for(int i=0;i<n;i++){
		if(pigs[i].die==1){
			cout << "DEAD" << endl;
			continue;
		}else{
			for(int j=0;j<pigs[i].pl;j++){
				cout << pigs[i].p[j] << " ";
			}
			cout << endl;
		}
	}
}

short xxx(int player,string sf){
	int mop=player+1;
	for(mop=player+1;true;mop++){
		if(mop>=n){
			mop-=n;
		}
		if(pigs[mop].die==1){
			continue;
		}
		break;
	}
	if((pigs[player].sf=="MP" && pigs[mop].sf=="FP" && pigs[mop].tiaobutiao==1) || (pigs[player].sf=="FP" && pigs[mop].sf=="MP") || (pigs[player].sf=="ZP" && pigs[mop].sf=="FP" && pigs[mop].tiaobutiao==1) || (pigs[player].sf=="FP" && pigs[mop].sf=="ZP" && pigs[mop].tiaobutiao==1) || (player==mp && pigs[mp].lf[mop]==1 && pigs[mop].tiaobutiao==0)){
		return mop;
	}
	return -1;
}

short kkk(int player,string sf){
	int mm;
	if(pigs[player].sf=="FP"){
		return mp;
	}
	for(int i=1;i<n;i++){
		mm=player+i;
		if(mm>=n){
			mm-=n;
		}
		if(pigs[mm].die==1){
			continue;
		}
		if((pigs[player].sf=="MP" && pigs[mm].sf=="FP" && pigs[mm].tiaobutiao==1) || (pigs[player].sf=="ZP" && pigs[mm].sf=="FP" && pigs[mm].tiaobutiao==1) || (pigs[player].sf=="FP" && pigs[mm].sf=="ZP" && pigs[mm].tiaobutiao==1) || (player==mp && pigs[mp].lf[mm]==1 && pigs[mm].tiaobutiao==0)){
			return mm;
		}
	}
	return -1;
}

int ssl(int player){
	int count3=0;
	for(int i=0;i<pigs[player].pl;i++){
		if(pigs[player].p[i]=='K'){
			count3++;
		}
	}
	return count3;
}

int ask(string x,int player){
	if(x=="taoshitadedijizhang_pai"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='P'){
				return i;
			}
		}
	}
	if(x=="shashitadedijizhang_pai"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='K'){
				return i;
			}
		}
	}
	if(x=="shanshitadedijizhang_pai"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='D'){
				return i;
			}
		}
	}
	if(x=="wuxiekejishitadedijizhang_pai"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='J'){
				return i;
			}
		}
	}
}

bool pd(string sj,int player){
	if(sj=="zhugong_die"){
		if(pigs[mp].die==1){
			return 1;
		}
	}
	if(sj=="zhongchen_die"){
		if(zhong_past>zhong){
			return 1;
		}
	}
	if(sj=="fanzei_die_all"){
		if(!fan){
			return 1;
		}
	}
	if(sj=="shifouyoukexiangying_pai:sha"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='K'){
				return 1;
			}
		}
	}
	if(sj=="shifouyoukexiangying_pai:shan"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='D'){
				return 1;
			}
		}
	}
	if(sj=="shifouyoukexiangying_pai:tao"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='P'){
				return 1;
			}
		}
	}
	if(sj=="shifouyoukexiangying_pai:wu_xie_ke_ji"){
		for(int i=0;i<pigs[player].pl;i++){
			if(pigs[player].p[i]=='J'){
				return 1;
			}
		}
	}
	if(sj=="others_wuxiekeji_xiangying_yes_or_no?" && (pigs[player].tiaobutiao==1 || player==mp)){ //mm--对player使用-->无懈可击 
		for(int i=0;i<n;i++){
			int mm=i+player;
			if(mm>=n){
				mm-=n;
			}
			if(mm=other){
				continue;
			}
			if(pd("shifouyoukexiangying_pai:wu_xie_ke_ji",mm) && ((pigs[mm].sf==pigs[player].sf && pigs[player].tiaobutiao) || (pigs[mm].sf=="MP" && pigs[player].sf=="ZP" && pigs[player].tiaobutiao) || (pigs[mm].sf=="ZP" && pigs[player].sf=="MP"))){
				other=mm;
				return 1;
			}
		}
	}
	if(sj=="shifouyitiao_enemy?"){
		for(int i=1;i<n;i++){
			int mm=i+player;
			if(mm>=n){
				mm-=n;
			}
			if((pigs[mm].tiaobutiao && pigs[mm].sf=="FP" && pigs[player].sf=="ZP" )||( pigs[mm].tiaobutiao && pigs[mm].sf=="ZP" && pigs[player].sf=="FP" )||( pigs[mm].sf=="MP" && pigs[player].sf=="FP" )||( pigs[mm].tiaobutiao && pigs[mm].sf=="FP" && pigs[player].sf=="MP" )||( pigs[mp].lf[mm] && pigs[player].sf=="MP")){
				return 1;
			}
		}
	}
	return 0;
}

void zx(string sj,int num,int player){
	if(sj=="use"){                   //num=第几张牌 player=谁在使用 
		if(pigs[player].p[num]=='P'){
			if(pigs[player].xue_liang<4){
				zx("syp",num,player);
				zx("jie_suan",1,player);
			}else{
				chuandi=1;
			}
		}else if(pigs[player].p[num]=='K'){
			if(ysys==0 || pigs[player].zgln){
				if(pd("shifouyitiao_enemy?",player)){
					ysys=1;
					pigs[player].zui_jin_chao_feng=xxx(player,pigs[player].sf);
					if(pigs[player].zui_jin_chao_feng==-1){
						chuandi=1;
						return;
					}
					if(pigs[player].zui_jin_chao_feng!=-1){
						zx("syp",num,player);
						zx("jie_suan",2,player);
					}
				}else{
					chuandi=1;
				}
			}else{
				chuandi=1;
			}
		}else if(pigs[player].p[num]=='F'){
			if(pd("shifouyitiao_enemy?",player)){
				pigs[player].zui_jin_chao_feng=kkk(player,pigs[player].sf);
				if(pigs[player].zui_jin_chao_feng==-1){
					chuandi=1;
					return;
				}
				if(pigs[player].zui_jin_chao_feng!=-1){
					zx("syp",num,player);
					zx("jie_suan",3,player);
				}
			}else{
				chuandi=1;
			}
		}else if(pigs[player].p[num]=='N'){
			zx("syp",num,player);
			zx("jie_suan",4,player);
		}else if(pigs[player].p[num]=='W'){
			zx("syp",num,player);
			zx("jie_suan",5,player);
		}else if(pigs[player].p[num]=='Z'){
			zx("syp",num,player);
			zx("jie_suan",6,player);
		}else{
			chuandi=1;
		}
	}
	if(sj=="jie_suan"){                   //num=什么牌 player=谁在使用 
		if(num==1){
			pigs[player].xue_liang++;
			shi_yong_zhe=player;
		}
		if(num==2){
			pigs[player].tiaobutiao=1;
			shi_yong_zhe=player;
			if(pd("shifouyoukexiangying_pai:shan",pigs[player].zui_jin_chao_feng)){
				zx("qizhi_wuxiekeji_shan_sha_tao",ask("shanshitadedijizhang_pai",pigs[player].zui_jin_chao_feng),pigs[player].zui_jin_chao_feng);
			}else{
				pigs[pigs[player].zui_jin_chao_feng].xue_liang--;
				binsi(pigs[player].zui_jin_chao_feng);
			}
		}
		if(num==3){
			pigs[player].tiaobutiao=1;
			shi_yong_zhe=player;
			other=pigs[player].zui_jin_chao_feng;
			if(pd("others_wuxiekeji_xiangying_yes_or_no?",other)){ 
				int ijn=1;
				pigs[other].tiaobutiao=1;
				zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
				int player2=other;
				while(pd("others_wuxiekeji_xiangying_yes_or_no?",player2)){
					ijn++;
					pigs[other].tiaobutiao=1;
					zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
					player2=other;
				}
				if(ijn%2==0){
					if(pd("shifouyoukexiangying_pai:sha",pigs[player].zui_jin_chao_feng)){
						zx("juedou_sha",player,pigs[player].zui_jin_chao_feng);
					}else{
						pigs[pigs[player].zui_jin_chao_feng].xue_liang--;
						binsi(pigs[player].zui_jin_chao_feng);
					}
				}
			}else if(pd("shifouyoukexiangying_pai:sha",pigs[player].zui_jin_chao_feng)){
				zx("juedou_sha",player,pigs[player].zui_jin_chao_feng);
			}else{
				pigs[pigs[player].zui_jin_chao_feng].xue_liang--;
				binsi(pigs[player].zui_jin_chao_feng);
			}
		}
		if(num==4){
			shi_yong_zhe=player;
			for(int i=1;i<n;i++){
				int asdf=i+player;
				if(asdf>=n){
					asdf-=n;
				}
				if(pigs[asdf].die){
					continue;
				}
				other=asdf;
				if(pd("others_wuxiekeji_xiangying_yes_or_no?",other)){
					int ijn=1;
					pigs[other].tiaobutiao=1;
					zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
					int player2=player;
					player=other;
					while(pd("others_wuxiekeji_xiangying_yes_or_no?",player)){
						ijn++;
						pigs[other].tiaobutiao=1;
						zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
						player=other;
					}
					if(ijn%2==0){
						if(pd("shifouyoukexiangying_pai:sha",asdf)){
							zx("qizhi_wuxiekeji_shan_sha_tao",ask("shashitadedijizhang_pai",asdf),asdf);
						}else{
							af=0;
							pigs[asdf].xue_liang--;
							binsi(asdf);
							if(af==1){
								nanzhu.push(asdf);
							}
						}
					}
				}else if(pd("shifouyoukexiangying_pai:sha",asdf)){
					zx("qizhi_wuxiekeji_shan_sha_tao",ask("shashitadedijizhang_pai",asdf),asdf);
				}else{
					af=0;
					pigs[asdf].xue_liang--;
					binsi(asdf);
					if(af==1){
						nanzhu.push(asdf);
					}
				}
				if(pd("zhugong_die",-1)){
					break;
				}
				if(pd("fanzei_die_all",-1)){
					break;
				}
			}
		}
		if(num==5){
			shi_yong_zhe=player;
			for(int i=1;i<n;i++){
				int asdf=i+player;
				if(asdf>=n){
					asdf-=n;
				}
				if(pigs[asdf].die){
					continue;
				}
				other=asdf;
				if(pd("others_wuxiekeji_xiangying_yes_or_no?",other)){
					int ijn=1;
					pigs[other].tiaobutiao=1;
					zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
					int player2=player;
					player=other;
					while(pd("others_wuxiekeji_xiangying_yes_or_no?",player)){
						ijn++;
						pigs[other].tiaobutiao=1;
						zx("qizhi_wuxiekeji_shan_sha_tao",ask("wuxiekejishitadedijizhang_pai",other),other);
						player=other;
					}
					if(ijn%2==0){
						if(pd("shifouyoukexiangying_pai:shan",asdf)){
							zx("qizhi_wuxiekeji_shan_sha_tao",ask("shanshitadedijizhang_pai",asdf),asdf);
						}else{
							af=0;
							pigs[asdf].xue_liang--;
							binsi(asdf);
							if(af==1){
								nanzhu.push(asdf);
							}
						}
					}
				}else if(pd("shifouyoukexiangying_pai:shan",asdf)){
					zx("qizhi_wuxiekeji_shan_sha_tao",ask("shanshitadedijizhang_pai",asdf),asdf);
				}else{
					af=0;
					pigs[asdf].xue_liang--;
					binsi(asdf);
					if(af==1){
						nanzhu.push(asdf);
					}
				}
				if(pd("zhugong_die",-1)){
					break;
				}
				if(pd("fanzei_die_all",-1)){
					break;
				}
			}
		}
		if(num==6){
			shi_yong_zhe=player;
			pigs[player].zgln=1;
		}
	}
	if(sj=="zhugong_qi_pai"){
		for(int i=0;i<pigs[mp].pl;i++){
			pigs[mp].p[i]==0;
		}
		pigs[mp].pl=0;
		pigs[mp].zgln=0;
	}
	if(sj=="mo_pai"){                   //num=几张牌 player=谁摸牌 
		for(int i=1;i<=num;i++){
			xcv=pd1.front();
			pd1.pop();
			pigs[player].p[pigs[player].pl]=xcv;
			pigs[player].pl++;
		}
	}
	if(sj=="syp"){                   //num=使用了第几张牌 player=使用的是谁的牌 
		for(int i=num;i<pigs[player].pl;i++){
			pigs[player].p[i]=pigs[player].p[i+1];
		}
		pigs[player].pl--;
	}
	if(sj=="qizhi_wuxiekeji_shan_sha_tao"){                   //player=谁在响应 
		zx("syp",num,player);
	}
	if(sj=="juedou_sha"){                   //player=谁先响应 num=谁后响应 num->player决斗 
		shi_yong_zhe=num;	 
		if(ssl(num)>=ssl(player)){
			int sdfg=ssl(player);
			zx("qizhisha",sdfg,player);
			zx("qizhisha",sdfg,num);
			pigs[player].xue_liang--;
			binsi(player);
		}
		if(ssl(num)<ssl(player)){
			int sdfg=ssl(num);
			zx("qizhisha",sdfg,num);
			zx("qizhisha",sdfg+1,player);
			pigs[num].xue_liang--;
			binsi(num);
		}
	}
	if(sj=="qizhisha"){                    //player=谁在弃杀 num=弃置多少张杀 
		int iii=0;
		for(int i=0;i<pigs[player].pl;i=i){
			if(pigs[player].p[i]=='K'){
				zx("syp",i,player);
				iii++;
			}else{
				i++;
			}
			if(iii==num){
				break;
			}
		}
	}	
}

short cp(int player){
	zx("mo_pai",2,player);
	for(int i=0;i<pigs[player].pl;i=i){
		af=-1;
		fan_past=fan;
		zhong_past=zhong;
		chuandi=0;
		zx("use",i,player);
		if(chuandi==1){
			i++;
		}else if(i>0){
			i=0;
		}
		if(pigs[player].die){
			break;
		}
		if(pd("zhugong_die",-1) && pd("fanzei_die_all",-1)){
			if(kkk520==1){
				return 1;
			}else{
				return 0;
			}
		}
		if(!nanzhu.empty()){
			if(player==mp){
				while(!nanzhu.empty()){
					int chen_zhe=nanzhu.front();
					nanzhu.pop();
					if(pigs[chen_zhe].sf=="ZP"){
						zx("zhugong_qi_pai",-1,-1);
					}else{
						zx("mo_pai",3,pigs[player].zui_jin_chao_feng);
					}
				}
			}else{
				while(!nanzhu.empty()){
					int chen_zhe=nanzhu.front();
					nanzhu.pop();
					if(pigs[chen_zhe].sf=="FP"){
						zx("mo_pai",3,pigs[player].zui_jin_chao_feng);
					}
				}
			}
		}
		if(pigs[player].sf=="FP" && pigs[player].die){
			zx("mo_pai",3,pigs[player].zui_jin_chao_feng);
			break;
		}
		if(pd("zhongchen_die",-1) && pd("fanzei_die_all",-1)){
			for(int i=player;i<n+player;i++){
				int poooo=i;
				if(poooo>=n){
					poooo-=n;
				}
				
			}
		}
		if(pd("zhugong_die",-1)){
			return 1;
		}
		if(pd("zhongchen_die",-1) && player==mp){
			zx("zhugong_qi_pai",-1,-1);
		}
		if(pd("fanzei_die_all",-1)){
			return 0;
		}
		if(pigs[player].p[i]!='N' && pigs[player].p[i]!='W'){
			zx("mo_pai",(fan_past-fan)*3,player);
		}
	}
	return -1;
}

void binsi(int player){
	if(pigs[player].xue_liang==0 && pd("shifouyoukexiangying_pai:tao",player)){
		zx("syp",ask("taoshitadedijizhang_pai",player),player);
		pigs[player].xue_liang++;
		if(pigs[player].sf=="MP"){
			pigs[mp].lf[shi_yong_zhe]=1;
		}
		return;
	}
	if(pigs[player].xue_liang>0){
		if(pigs[player].sf=="MP"){
			pigs[mp].lf[shi_yong_zhe]=1;
		}
		return;
	}
	pigs[player].die=1;
	if(pigs[player].sf=="MP"){
		zhu--;
		if(zhu==0){
			kkk520=1;
		}
	}else if(pigs[player].sf=="ZP"){
		zhong--;
		if(af==0){
			af=1;
		}
	}else{
		fan--;
		if(fan==0){
			kkk520=2;
		}
		if(af==0){
			af==1;
		}
	}
}

int main(){
	cin >> n >> m;
	for(int i=0;i<n;i++){
		cin >> pigs[i].sf;
		memset(pigs[i].p,0,sizeof(pigs[i].p));
		for(int j=0;j<4;j++){
			cin >> pigs[i].p[j];
			pigs[i].pl=4;
			pigs[i].xue_liang=4;
			pigs[i].tiaobutiao=0;
			pigs[i].die=0;
			pigs[i].zgln=0;
		}
		if(pigs[i].sf=="MP"){
			memset(pigs[i].lf,0,sizeof(pigs[i].lf));
			mp=i;
			pigs[mp].tiaobutiao=1;
			zhu++;
		}else if(pigs[i].sf=="FP"){
			fan++;
		}else{
			zhong++;
		}
	}
	for(int i=0;i<m;i++){
		char nm;
		cin >> nm;
		pd1.push(nm);
		if(i==m-1){
			for(int i=0;i<10000;i++){
				pd1.push(nm); 
			} 
		}
	}
	while(true){
		for(int i=mp;i<n+mp;i++){
			int lplp=i;
			if(lplp>=n){
				lplp-=n;
			}
			if(pigs[lplp].die==1){
				continue;
			}
			ysys=0;
			ans=cp(lplp);
			if(ans==0 || ans==1){
				fff=1;
				break;
			}
		}
		if(fff){
			break;
		}
	}
	ans ? cout << "FP" : cout << "MP";
	cout << endl;
	js(); 
	return 0;
}
2022/7/20 14:50
加载中...