向大佬求助!
查看原帖
向大佬求助!
348399
zbe_楼主2022/10/27 19:28

以下代码在Windows上运行毫无问题,但提交上去后或使用洛古在线IDE则会TLE与WA,能不能帮忙看看是哪里有问题?

#include<bits/stdc++.h>
using namespace std;
struct A{
	bool zb;
	int sf,xia,shang,sp,xie,zt;
}a[21];//装备,身份,下一家,上一家,手牌数,当前血量,跳反或跳忠或类反
char sp[21][6001],pd[4001],c;//每名玩家的手牌,牌堆
int n,m,pai,fz;
//pai:当前用到牌堆第几张牌;fz:存活的反贼数
bool jieshu(){ //对于结束的判定与输出
	if(a[1].xie<=0||fz<=0){
		if(a[1].xie<=0){
			printf("FP\n");
		}
		else{
			printf("MP\n");
		}
		int i;
		for(i=1;i<=n;i++){
			if(a[i].xie<=0){
				printf("DEAD\n");
			}
			else{
				bool b=0;
				for(int j=1;j<=a[i].sp;j++){
					if(sp[i][j]>='A'&&sp[i][j]<='Z'){
						if(b){
							printf(" ");
						}
                        putchar(sp[i][j]);
						b=1;
					}
				}
				printf("\n");
			}
		}
		exit(0);
	}
	return 0;
}
void bs(int p,int shly){ //判断是否进入濒死与死亡判定,shly:伤害来源
	if(--a[p].xie==0){
		int i,j;
		for(i=1;i<=a[p].sp;i++){
			if(sp[p][i]=='P'){
				sp[p][i]==' ';
				a[p].xie++;
				break;
			}
		}
		if(a[p].xie==0){
			if(a[p].sf==3){
				fz--;
			}
			jieshu();
			if(a[p].sf==3){
				sp[shly][++a[shly].sp]=pd[min(++pai,m)];
				sp[shly][++a[shly].sp]=pd[min(++pai,m)];
				sp[shly][++a[shly].sp]=pd[min(++pai,m)];
			}
			if(a[p].sf==2&&a[shly].sf==1){
				a[shly].zb=0;
				a[shly].sp=0;
			}
			a[a[p].shang].xia=a[p].xia;
			a[a[p].xia].shang=a[p].shang;
			a[p].sp=0;
		}
	}
	return ;
}
bool _wuxie(int p){ //无懈别人的无懈
	int i=p,j;
	do{
		if((a[p].zt==1&&a[i].sf<=2)||(a[p].zt==-1&&a[i].sf==3)){
			for(j=1;j<=a[i].sp;j++){
				if(sp[i][j]=='J'){
					sp[i][j]=' ';
					a[i].zt=0-a[p].zt;
					return !_wuxie(i);
				}
			}
		}
		i=a[i].xia;
	}while(i!=p);
	return 0;
}
bool wuxie(int p){ //无懈除无懈外的锦囊
	int i=p,j;
	do{
		if((a[p].zt==1&&a[i].sf==3)||(a[p].zt==-1&&a[i].sf<=2)){
			for(j=1;j<=a[i].sp;j++){
				if(sp[i][j]=='J'){
					sp[i][j]=' ';
					a[i].zt=a[p].zt;
					return !_wuxie(i);
				}
			}
		}
		i=a[i].xia;
	}while(i!=p);
	return 0;
}
void aoe(char cp,int shly){ //南门与万箭
	int i,j;
	bool b;
	for(i=a[shly].xia;i!=shly;i=a[i].xia){
		if(wuxie(i)){
			continue;
		}
		b=1;
		for(j=1;j<=a[i].sp;j++){
			if(sp[i][j]==cp){
				sp[i][j]=' ';
				b=0;
				break;
			}
		}
		if(b){
			bs(i,shly);
			if(i==1&&a[shly].zt==0){
				a[shly].zt=2;
			}
		}
	}
	return ;
}
void kil(int p,int shly){ //杀
	if(a[shly].zt==0){
		if(a[p].zt==-1){
			a[shly].zt=1;
		}
		if(a[p].zt==1){
			a[shly].zt=-1;
		}
	}
	int i;
	for(i=1;i<=a[p].sp;i++){
		if(sp[p][i]=='D'){
			sp[p][i]=' ';
			return ;
		}
	}
	bs(p,i);
	return ;
}
void juedou(int x,int y){ //决斗
	if(a[y].zt==0){
		if(a[x].zt==-1){
			a[y].zt=1;
		}
		if(a[x].zt==1){
			a[y].zt=-1;
		}
	}
	if(wuxie(x)){
		return ;
	}
	if(a[x].sf==2&&a[y].sf==1){
		bs(x,y);
	}
	int i=1,j=1;
	for(bool b=1;;b=!b){
		if(b){
			for(;i<=a[x].sp;i++){
				if(sp[x][i]=='K'){
					sp[x][i]=' ';
					break;
				}
			}
			if(i>a[x].sp){
				bs(x,y);
				return ;
			}
		}
		else{
			for(;j<=a[y].sp;j++){
				if(sp[y][j]=='K'){
					sp[y][j]=' ';
					break;
				}
			}
			if(j>a[y].sp){
				bs(y,x);
				return ;
			}
		}
	}
}
int main(){
	int i,j,k;
	bool sha=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%c",&c);
		if(c=='M'){
			a[i].sf=1;
			a[i].zt=-1; //zt=-1为主公方,zt=1为反贼方,zt=2为类反
		}
		else if(c=='Z'){
			a[i].sf=2;
		}
		else if(c=='F'){
			a[i].sf=3;
			fz++;
		}
		else{
			i--;
			continue;
		}
		scanf("%c",&c);
		a[i].xie=4;
		if(i==n){
			a[i].xia=1;
		}
		else{
			a[i].xia=i+1;
		}
		if(i==1){
			a[i].shang=n;
		}
		else{
			a[i].shang=i-1;
		}//初始上下家
		for(a[i].sp=1;a[i].sp<=4;a[i].sp++){
			scanf("%c",&c);
			if(!(c>='A'&&c<='Z')){
				a[i].sp--;
				continue;
			}
			else{
				sp[i][a[i].sp]=c;
			}
		}
	}//初始手牌
	for(i=1;i<=m;i++){
		scanf("%c",&c);
		if(c==' '||c=='\n'){
			i--;
			continue;
		}
		pd[i]=c;
	}//初始牌堆
	
	for(i=1;!jieshu();i=a[i].xia){//游戏开始
		sp[i][++a[i].sp]=pd[min(++pai,m)];
		sp[i][++a[i].sp]=pd[min(++pai,m)];
     //摸牌
		sha=0;
     //有无用杀
		for(j=1;j<=a[i].sp;j++){
			switch(sp[i][j]){
				case 'N':{
					sp[i][j]=' ';
					aoe('K',i);
					break;
				}
				case 'W':{
					sp[i][j]=' ';
					aoe('D',i);
					break;
				}
				case 'Z':{
					a[i].zb=1;
					sp[i][j]=' ';
					j=0;
					break;
				}
				case 'P':{
					if(a[i].xie<4){
						a[i].xie++;
						sp[i][j]=' ';
					}
					break;
				}
				case 'K':{
					if((!sha||a[i].zb)&&((a[a[i].xia].zt==-1&&a[i].sf==3)||(a[a[i].xia].zt==1&&a[i].sf<=2)||(a[a[i].xia].zt==2&&a[i].sf==1))){
						sp[i][j]=' ';
						kil(a[i].xia,i);
					}
					break;
				}
				case 'F':{
					for(k=a[i].xia;k!=i;k=a[k].xia){
						if((a[k].zt==-1&&a[i].sf==3)||(a[k].zt==1&&a[i].sf<=2)||(a[k].zt==2&&a[i].sf==1)){
							sp[i][j]=' ';
							juedou(k,i);
						}
					}
					break;
				}
			}
		}
	}
}
2022/10/27 19:28
加载中...