【模拟】HDU 1107 武林

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1107

 

 

超长的模拟。。。

 

注意当峨眉弟子在(1,12)和(12,1)两处时会在原地不动

 

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

struct dis{
    char t;
    int x,y;
    int dir;
    int mp,str,hp;
    int att;
    int alive;
    int flag;
}peo[1010];

int map[20][20][1010];
int num[20][20];

double cal_att(struct dis a){
    
    double res;
    
    switch (a.t)
    {
    case 'S':
        res=(0.5 * a.mp + 0.5 * a.str) * (a.hp + 10) / 100.0 ;
        break;
    case 'W':
        res=(0.8 * a.mp + 0.2 * a.str) * (a.hp + 10) / 100.0 ;
        break;
    case 'E':
        res=(0.2 * a.mp + 0.8 * a.str) * (a.hp + 10) / 100.0 ;
        break;
    }
    return res;
    
}

void fight(int a,int b){
    
    peo[a].att=cal_att(peo[a]);
    peo[b].att=cal_att(peo[b]);
    peo[a].hp-=peo[b].att;
    peo[b].hp-=peo[a].att;
    if(peo[a].hp<=0)
        peo[a].alive=0;
    if(peo[b].hp<=0)
        peo[b].alive=0;
        
}

void change(int q){
    
    switch(peo[q].t){
    case 'S':
        if(peo[q].x+peo[q].dir<=12&&peo[q].x+peo[q].dir>=1){
            peo[q].x+=peo[q].dir;
        }else{
            peo[q].dir=-peo[q].dir;
            peo[q].x+=peo[q].dir;
        }
        map[peo[q].x][peo[q].y][num[peo[q].x][peo[q].y]]=q;
        num[peo[q].x][peo[q].y]++;
        break;
    case 'W':
        if(peo[q].y+peo[q].dir<=12&&peo[q].y+peo[q].dir>=1){
            peo[q].y+=peo[q].dir;
        }else{
            peo[q].dir=-peo[q].dir;
            peo[q].y+=peo[q].dir;
        }
        map[peo[q].x][peo[q].y][num[peo[q].x][peo[q].y]]=q;
        num[peo[q].x][peo[q].y]++;
        break;
    case 'E':
        if((peo[q].x==12&&peo[q].y==1)||(peo[q].x==1&&peo[q].y==12)){
            break;
        }
        if(peo[q].y+peo[q].dir<=12&&peo[q].x+peo[q].dir<=12&&peo[q].y+peo[q].dir>=1&&peo[q].x+peo[q].dir>=1){
            peo[q].y+=peo[q].dir;
            peo[q].x+=peo[q].dir;
        }else{
            peo[q].dir=-peo[q].dir;
            peo[q].y+=peo[q].dir;
            peo[q].x+=peo[q].dir;
        }
        map[peo[q].x][peo[q].y][num[peo[q].x][peo[q].y]]=q;
        num[peo[q].x][peo[q].y]++;
        break;
    }
    peo[q].flag=1;
    
    
}

void del(int x,int y,int sit){
    int i;
    
    for(i=sit;i<num[x][y]-1;++i){
        map[x][y][i]=map[x][y][i+1];
    }
    num[x][y]--;
    
}

void move(int x,int y,int n){
    
    if(num[x][y]==0)return;
    int i;
    int q;
    for(i=0;i<num[x][y];++i){
        q=map[x][y][i];
        if(peo[q].hp>0&&!peo[q].flag){
            change(q);
            
        }
    }
    for(i=0;i<num[x][y];i++){
        if(peo[map[x][y][i]].x!=x||peo[map[x][y][i]].y!=y||!peo[map[x][y][i]].alive){
            del(x,y,i);
            i--;
        }
    }
    
}
            



int main(){
    int w;
    int n;
    int i,j;
    int node=0;
    cin>>w;
    while(w--){
        memset(num,0,sizeof(num));
        node=0;
        cin>>n;
        while(cin>>peo[node].t&&peo[node].t!='0'){
            cin>>peo[node].x>>peo[node].y>>peo[node].mp>>peo[node].str>>peo[node].hp;
            getchar();
            peo[node].dir=1;
            peo[node].alive=1;
            map[peo[node].x][peo[node].y][num[peo[node].x][peo[node].y]]=node;
            num[peo[node].x][peo[node].y]++;
            node++;
        };
        while(n){
            for(i=0;i<node;++i){
                peo[i].flag=0;
            }
            for(i=1;i<=12;++i){
                for(j=1;j<=12;++j){
                    if(num[i][j]==2)
                        if(peo[map[i][j][0]].t!=peo[map[i][j][1]].t){
                            fight(map[i][j][0],map[i][j][1]);
                    }
                }
            }
            for(i=1;i<=12;++i){
                for(j=1;j<=12;++j){
                    move(i,j,n);
                }
            }
            
            n--;
        }
        int s_num=0,w_num=0,e_num=0,s_sum=0,w_sum=0,e_sum=0;
        for(i=0;i<node;++i){
            if(peo[i].t=='S'&&peo[i].alive){
                s_num++;
                s_sum+=peo[i].hp;
            }
            if(peo[i].t=='W'&&peo[i].alive){
                w_num++;
                w_sum+=peo[i].hp;
            }
            if(peo[i].t=='E'&&peo[i].alive){
                e_num++;
                e_sum+=peo[i].hp;
            }
        }
        printf("%d %d\n",s_num,s_sum);
        printf("%d %d\n",w_num,w_sum);
        printf("%d %d\n",e_num,e_sum);
        printf("***\n");
    }
    return 0;
}


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值