hdu 1107 武林【模拟】

来源:互联网 发布:p2p网络借贷平台 调查 编辑:程序博客网 时间:2024/05/16 07:15

题目连接: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;}

0 0
原创粉丝点击