比较夸张的模拟题,今天终于过了~~~
#include<iostream>#include<cstring>#include<cstdlib>using namespace std;struct player{ char belong;//门派 int position[2];//坐标位置 int ability[3];//内力,武艺,生命力 int alive;//活的还是死的};player play[1005];int map[13][13];//地图int smflag=1,wmflag=1,emflag=1;//三个全局变量,用于移动时的转向void move(player& t)//player的移动{ map[t.position[0]][t.position[1]]--;//原先的坐标上人数减一 if(t.alive==1) { char ch=t.belong; switch(ch) { case'S': { if(t.position[0]==12&&smflag==1) smflag=0; if(t.position[0]==1&&smflag==0) smflag=1; if(smflag) t.position[0]+=1; else t.position[0]-=1; break; } case'W': { if(t.position[1]==12&&wmflag==1) wmflag=0; if(t.position[1]==1&&wmflag==0) wmflag=1; if(wmflag) t.position[1]+=1; else t.position[1]-=1; break; } case'E': { if(((t.position[0]==12&&t.position[1]!=1)|| (t.position[1]==12&&t.position[0]!=1))&&emflag==1) emflag=0; if(((t.position[0]==1&&t.position[1]!=12)|| (t.position[1]==1&&t.position[0]!=12))&&emflag==0) emflag=1; if((t.position[0]==1&&t.position[1]==12) ||(t.position[0]==12&&t.position[1]==1)) emflag=2; if(emflag==1) { t.position[0]+=1; t.position[1]+=1; } if(emflag==0) { t.position[0]-=1; t.position[1]-=1; } break; } } map[t.position[0]][t.position[1]]++;//后来到达的坐标上人数加一 }}int cal(int k)//计算攻击力{ char ch=play[k].belong; double t=0; switch(ch) { case'S':t=(0.5*play[k].ability[0]+ 0.5*play[k].ability[1])*(play[k].ability[2]+10)/100;break; case'W':t=(0.8*play[k].ability[0]+ 0.2*play[k].ability[1])*(play[k].ability[2]+10)/100;break; case'E':t=(0.2*play[k].ability[0]+ 0.8*play[k].ability[1])*(play[k].ability[2]+10)/100;break; } return t;}void fight(int k1,int k2){ int a1=cal(k1); int a2=cal(k2); play[k1].ability[2]-=a2; play[k2].ability[2]-=a1; if(play[k1].ability[2]<=0) play[k1].alive=0; if(play[k2].ability[2]<=0) play[k2].alive=0;
}void check_fight(int k){ char ch1,ch2; int k1,k2; int flag1=1; for(int i=1;i<=12;i++) for(int j=1;j<=12;j++) { if(map[i][j]!=2) continue;//遍历图上每个点,只有其中有两个players的格子 //才有可能开战 else { for(int m=1;m<k;m++) { if(play[m].position[0]==i&&play[m].position[1]==j)//找到在该格子中的两个player { if(flag1==1) { ch1=play[m].belong; k1=m; flag1=2; } else { ch2=play[m].belong; k2=m; flag1=1; } } } if(ch1!=ch2&&play[k1].alive==1&&play[k2].alive==1)//门派不同,并且都活的 { fight(k1,k2);//开战 } } }}void output(int k)//输出函数{ int salive=0,walive=0,ealive=0;//统计各派活着的人数 int slife=0,wlife=0,elife=0;//各派活着的人的生命值 for(int i=1;i<k;i++) { if(play[i].alive==1) { switch(play[i].belong) { case'S':salive++; slife=slife+play[i].ability[2]; break; case'W':walive++; wlife=wlife+play[i].ability[2]; break; case'E':ealive++; elife=elife+play[i].ability[2]; break; } } } cout<<salive<<" "<<slife<<endl; cout<<walive<<" "<<wlife<<endl; cout<<ealive<<" "<<elife<<endl; cout<<"***"<<endl;}int main(){ int n; cin>>n; while(n--) { smflag=1; wmflag=1; emflag=1; memset(map,0,sizeof(map)); int step; cin>>step; int k=1; while(1) { cin>>play[k].belong; if(play[k].belong=='0') break; cin>>play[k].position[0]>>play[k].position[1] >>play[k].ability[0]>>play[k].ability[1]>>play[k].ability[2]; play[k].alive=1; map[play[k].position[0]][play[k].position[1]]++; k++; } while(step--) { check_fight(k); for(int i=1;i<k;i++) move(play[i]); } output(k); } return 0;}
