以下代码在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;
}
}
}
}
}