hdoj1107(武林)

    技术2026-08-18  24

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

     

    #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)