读入有问题,全WA,估计算法有点问题,有注释,求调,悬2关
查看原帖
读入有问题,全WA,估计算法有点问题,有注释,求调,悬2关
776337
sugawara楼主2023/8/21 00:17

测评记录

代码:

#include<iostream>
#include<string>
using namespace std;
const int N=1e6+10;
bool over=false;
int n,m;
int pile[2050],top;
int jump_f[2000],f_top;
int jump_z[2000],z_top;
struct m{
	char brand[N];//手牌 
	int hp;//血量 
	char attack;
	string category;//种类*忠臣,反贼,主公 
	int source;//最后一次伤害来源 
}pig[20];
int size(int pi){
	for(int i=1;i<=N;i++){
		if(pig[pi].brand[i]=='a'){
			return i-1;
		}
	}	
}
int touch(){//摸牌 
	if(top==0){
		return pile[top];
	}
	else return pile[top--];
}
bool die(int pi){//判断猪是否死亡 
	if(pig[pi].hp==0) return true;
	return false;
}
void discard(int pi){//判断死亡后猪的最后一次伤害是否要弃牌 
	if(pig[pi].category[1]=='M') over=true;
	if(pig[pi].category[1]=='Z'){
		for(int i=1;i<=n;i++){
			if(pig[i].category[1]=='M'){
				for(int j=1;j<=size(i);j++){
					pig[i].brand[j]='a';
				}
			}
		}
	}
	else if(pig[pi].category[1]=='F'){
		pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
		pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
		pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
	}
}
void infer(){//判断跳反猪 or 类反猪 ,反正最后都要被MP表敌 
	for(int i=1;i<=n;i++){
		if(pig[i].category[0]=='M' and pig[i].category[1]=='P'){
			jump_f[f_top++]=pig[i].source;
		}
	}
}
bool decide(int pi){//pi表示对哪个猪使用 无懈可击 
	if(pig[pi].category[1]=='M' or pig[pi].category[1]=='Z'){
		for(int i=1;i<=f_top;i++){
			if(jump_f[i]==pi) return false;
		}
		return true;
	}
	else{
		for(int i=1;i<=f_top;i++){
			if(jump_f[i]==pi) return true;
		}
		return false;
	}
} 
//无懈可击,暂时不修 
bool invulnerable(char armoury,int pi){//无懈可击 
	if(armoury=='l'){//决斗 
		infer();//推理一波 
		if(decide(pi)) return true;//判断是否打出无懈击 
		return false;
	}
	if(armoury=='n'){//南蛮入侵 
		infer(); //判断一下跳忠跳反猪 
		if(decide(pi)) return true;//判断是否打出无懈可击 
		return false;
	}
	if(armoury=='y'){//万箭齐发 
		infer();//参上 
		if(decide(pi)) return true;//判断是否打出无懈 
		return false;
	}
}
void intrusion(int pi){//南蛮入侵 
	int hhp;
	for(int i=1;i<=n;i++){
	invulnerable('n',pi);//无懈可击询问 
		if(i!=pi){
			for(int j=1;j<=size(i);j++){
				if(pig[i].brand[j]=='K'){//有杀打出 
					hhp=1;
					break;
				}
			}
			if(hhp==0) pig[i].hp--,pig[i].source=pi;
		}
	}
}
void volley(int pi){//万箭齐发 	
	int hhp;
	for(int i=1;i<=n;i++){
		invulnerable('y',pi);//无懈可击询问 
		if(i!=pi){
			for(int j=1;j<=size(i);j++){
				if(pig[i].brand[j]=='D'){
					pig[i].brand[i]='a';//有闪打出 
					hhp=1;
					break;
				}
			}
			if(hhp==0) pig[i].hp--,pig[i].source=pi;
		}
	}
}
void duel(int pi,int pig_2){//决斗 
	while(!decide(pig_2)) pig_2--;
	if(!invulnerable('l',pi)){//无懈可击询问 
		return ;
	}
}
bool dodge(int who){//闪 
	for(int i=1;i<=size(who);i++){
		if(pig[who].brand[i]=='D'){
			return true;
		}
	}
	return false;
}
void kill(int who,int pi){//杀 
	if(dodge(who)) return ;//有闪 
	else pig[who].hp--;//没闪 
	if(pig[pi].attack=='Z'){
		for(int i=1;i<=size(pi);i++){
			
		}
	} 
}
void peach(int pi){//桃 
	if(pig[pi].hp!=4){
		for(int i=1;i<=size(pi);i++){
			if(pig[i].brand[i]=='P'){
				pig[i].brand[i]='a';
			}
		}
	}
}
void equip(int pi){//装备 
	if(size(pi)=='Z'){
		pig[pi].brand[size(pi)]='a';
		pig[pi].source='Z';
	} 
}
int main(){
	scanf("%d%d",&n,&m);
	top=m;
	for(int i=1;i<=n;i++){
		printf("%s%s",&pig[i].category[1],&pig[i].category[2]);
		scanf("%c %c %c %c",&pig[i].brand[1],&pig[i].brand[2],&pig[i].brand[2],&pig[i].brand[3],&pig[i].brand[4]);
	}
	//for(int i=1;i<=m;i++) scanf("%d",&pile[i]);
	for(int i=1;i<=1;i++){
		for(int j=size(i);j>=1;j++){
			if(pig[i].brand[j]=='K') kill(i-1,i);
			if(pig[i].brand[j]=='P') peach(i);
			if(pig[i].brand[j]=='Z') equip(i);
			if(pig[i].brand[j]=='N') intrusion(i);
			if(pig[i].brand[j]=='W') volley(i);
			if(pig[i].brand[j]=='F') duel(i,i-1);
		}
	} 
	for(int i=2;i<=n;i++){
			if(die(i)){
				discard(i);
				continue;
			}
			for(int j=size(i);j>=1;j++){
			if(pig[i].brand[j]=='K') kill(i-1,i);
			if(pig[i].brand[j]=='P') peach(i);
			if(pig[i].brand[j]=='Z') equip(i);
			if(pig[i].brand[j]=='N') intrusion(i);
			if(pig[i].brand[j]=='W') volley(i);
			if(pig[i].brand[j]=='F') duel(i,i-1);
		}
	}
	if(over) printf("FP \n");
	else printf("MP \n ");
	for(int i=1;i<=n;i++){
		if(die(i)) printf("DEAD \n");
		else{
			printf("%s%s \n",pig[i].category[1],pig[i].category[2]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=size(i);j++){
			if(pig[i].brand[j]!='a'){
				printf("%c ",pig[i].brand[j]);
			}
		}
	}
	return 0;
}

有注释,应该很好懂

2023/8/21 00:17
加载中...