【模拟】HDU 1107 武林
2014-08-10 14:33
375 查看
题目链接: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; }
相关文章推荐
- hdu 1107 武林【模拟】
- HDU 1107 武林(大模拟)
- HDU 1107 武林(模拟)
- HDU-1107-武林-2014-01-23 20:00:59
- HDU-武林-模拟
- HDU 1107 武林
- HDU 1107 武林
- HdU OJ 1107 武林 一只巨大的模拟
- HDU 1107 武林
- acm.hdu.edu.cn-1107武林采用小型项目式解决方案
- HDU 4121 模拟
- hdu 4020 模拟
- [1107-1109]模拟赛
- hdu 3688 蛮巧的模拟
- 【模拟】HDU 4134
- hdu 1303 Doubles(模拟)
- HDU 1062 Text Reverse(简单模拟)
- 【模拟】2011 Asia ChenDu Regional Contest 成都现场赛 hdu 4119
- HDU 1002 A + B Problem II(模拟)
- HDU 3644 计算几何 模拟退火