您的位置:首页 > 其它

【模拟】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