比较夸张的模拟题,今天终于过了~~~
#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;
}