题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1107
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int maxn=2000+10; typedef struct Node { int x,y; int level,in,out,lift;//门派,内力,外力,生命值 bool flag,dir;//标记是否比过无,方向(正方向,反方向) }; Node n[maxn]; int map[13][13],num; int effect(int i)//计算战斗力 { switch(n[i].level) { case 1:return (int)(((0.5*n[i].in+0.5*n[i].out)*(n[i].lift+10)*1.0)/100); case 2:return (int)(((0.8*n[i].in+0.2*n[i].out)*(n[i].lift+10)*1.0)/100); case 3:return (int)(((0.2*n[i].in+0.8*n[i].out)*(n[i].lift+10)*1.0)/100); } } void move(int i)//移动 { if(n[i].level==1) { if(n[i].x==12&&n[i].dir) { n[i].dir=false; n[i].x--; } else if(n[i].x==1&&!n[i].dir) { n[i].dir=true; n[i].x++; } else { if(n[i].dir)n[i].x++; else n[i].x--; } } else if(n[i].level==2) { if(n[i].y==12&&n[i].dir) { n[i].dir=false; n[i].y--; } else if(n[i].y==1&&!n[i].dir) { n[i].dir=true; n[i].y++; } else { if(n[i].dir)n[i].y++; else n[i].y--; } } else { if(n[i].x==12&&n[i].y==1) return; if(n[i].x==1&&n[i].y==12) return; if((n[i].x==12||n[i].y==12)&&n[i].dir) { n[i].dir=false; n[i].x--; n[i].y--; } else if((n[i].x==1||n[i].y==1)&&!n[i].dir) { n[i].dir=true; n[i].x++; n[i].y++; } else { if(n[i].dir) { n[i].x++; n[i].y++; } else { n[i].x--; n[i].y--; } } } } void fight() { for(int i=0;i<num;i++) n[i].flag=false; for(int i=0;i<num;i++) { if(map[n[i].x][n[i].y]==2&&n[i].lift>0&&!n[i].flag)//如果当前位置有2个人且此人生命值》0,未打过架 { for(int j=0;j<num;j++) { if(n[i].x==n[j].x&&n[i].y==n[j].y&&n[i].level!=n[j].level&&n[j].lift>0 )//这2人不同门派,此人未打过架,生命值》0 { int e1=effect(i); int e2=effect(j); n[i].lift-=e2; n[j].lift-=e1; n[i].flag=n[j].flag=true; } } } } memset(map,0,sizeof(map)); for(int i=0;i<num;i++)//更新每个人的位置 { move(i); if(n[i].lift>0) map[n[i].x][n[i].y]++; } } int main() { int T,N,sum[4][2]; char c[2]; scanf("%d",&T); while(T--) { num=0; scanf("%d",&N); memset(map,0,sizeof(map)); while(~scanf("%s",c)&&c[0]!=‘0‘) { scanf("%d%d%d%d%d",&n[num].x,&n[num].y,&n[num].in,&n[num].out,&n[num].lift); n[num].dir=true; if(c[0]==‘S‘)n[num].level=1; else if(c[0]==‘W‘)n[num].level=2; else n[num].level=3; map[n[num].x][n[num].y]++; num++; } while(N--) { fight(); } memset(sum,0,sizeof(sum)); for(int i=0;i<num;i++) { if(n[i].level==1&&n[i].lift>0) { sum[1][0]++; sum[1][1]+=n[i].lift; } else if(n[i].level==2&&n[i].lift>0) { sum[2][0]++; sum[2][1]+=n[i].lift; } else if(n[i].level==3&&n[i].lift>0) { sum[3][0]++; sum[3][1]+=n[i].lift; } } for(int i=1;i<=3;i++) printf("%d %d\n",sum[i][0],sum[i][1]); printf("***\n"); } return 0; }
时间: 2024-10-13 16:18:15