hdoj1107(武林)

比较夸张的模拟题,今天终于过了~~~

 

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值