HDU 1107

来源:互联网 发布:日语语音翻译软件 编辑:程序博客网 时间:2024/06/11 16:19

acm中为了避免大量数据的输入,可以加入一句

freopen("1107.txt","r",stdin);

就可以了,其他都不用改变

在主函数返回之前关闭文件fclose(stdin);


#include<stdio.h>
#include<malloc.h>
typedef struct Man
{
char name;
int nl,wy,hp;
int dirx,diry;
struct Man *next;
}Man;


typedef struct Node
{
int i,j;//场地坐标
int num;//场地人数
struct Node *cd;//下一个场地
struct Man *adj;//该场地中的第一个战斗者
}Node;


void Insert(Node *l,Man *p,int i,int j)
{
Node *t,*s,*n;
t=l;
if(p && i>0 && i<=12 && j>0 &&j<=12)
{
t=l->cd;
s=l;
while(t)
{
if(t->i==i && t->j==j)
{
p->next=t->adj;
t->num++;
t->adj=p;
return;
}
t=t->cd;
s=s->cd;//s用与保存末尾的非空结点
}


//当链表上无欲插入场地时,用尾插法在场地的末尾执行插入操作
n=(Node*)malloc(sizeof(Node));
n->num=1;
n->i=i;
n->j=j;
n->cd=NULL;
s->cd=n;
n->adj=p;
p->next=NULL;
}
}


int Attack(Man *p)
{
int a;
a=0;
if(p->name=='S')
{
a=(int)((0.5*p->nl+0.5*p->wy)*(p->hp+10)/100);
}
else if(p->name=='W')
{
a=(int)((0.8*p->nl+0.2*p->wy)*(p->hp+10)/100);
}
else if(p->name=='E')
{
a=(int)((0.2*p->nl+0.8*p->wy)*(p->hp+10)/100);
}
return a;
}


void Fight(Node *l)
{
Node *p,*q;
Man *s,*t;
int a,b;
p=l->cd;
q=l;
//q指向p的前驱结点
while(p)
{
if(p->num==2 && p->adj->name!=p->adj->next->name)
{
s=p->adj;
t=s->next;
a=Attack(t);
b=Attack(s);
s->hp-=a;
t->hp-=b;
if(s->hp<=0 && t->hp<=0)
{
q->cd=p->cd;//删除场地
p=q->cd;
continue;
}
else if(s->hp<=0)
{
p->num--;
p->adj=t;//删除s
}
else if(t->hp<=0)
{
p->num--;
s->next=NULL;//删除t
}
}
q=q->cd;
p=p->cd;
}
}


void Go(Man *p,int i,int j)
{
if(p->name=='S')
{
if(i==1)
{
p->dirx=0;
p->diry=1;
}
else if(i==12)
{
p->dirx=0;
p->diry=-1;
}
}
else if(p->name=='W')
{
if(j==1)
{
p->dirx=1;
p->diry=0;
}
else if(j==12)
{
p->dirx=-1;
p->diry=0;
}
}
else if(p->name=='E')
{
if(i==1||j==1)
{
p->dirx=1;
p->diry=1;
}
else if(i==12||j==12)
{
p->dirx=-1;
p->diry=-1;
}
}
}


void Move(Node *l)
{
//移动操作实际是对当前链表的扫描,并重新建立新的l链表
//e指向当前链表的最后一个场地
Node *p;
Man *t,*s;
p=l->cd;
l->cd=NULL;
while(p)
{
t=p->adj;
while(t)
{
s=t->next;
t->next=NULL;
Go(t,p->i,p->j);//计算出下一步的走向
if(p->i+t->diry>0 && p->i+t->diry<=12 &&
p->j+t->dirx>0 && p->j+t->dirx<=12)
Insert(l,t,p->i+t->diry,p->j+t->dirx);
else
Insert(l,t,p->i,p->j);
t=s;
}
p=p->cd;
}
}


void Cmp(Man *p)
{
if(p->name=='S')
{
p->dirx=0;
p->diry=1;
}
else if(p->name=='W')
{
p->dirx=1;
p->diry=0;
}
else if(p->name=='E')
{
p->dirx=1;
p->diry=1;
}
}


void  Init(Node *l)
{
char c;
Man *q;
int i,j,nl,wy,hp;
l->cd=NULL;
l->adj=NULL;
l->i=0;
l->j=0;
while((c=getchar())!=EOF && c!='0')
{
scanf("%d %d %d %d %d ",&i,&j,&nl,&wy,&hp);
q=(Man*)malloc(sizeof(Man));
q->name=c;
q->nl=nl;
q->wy=wy;
q->hp=hp;
q->next=NULL;
Cmp(q);
Insert(l,q,i,j);
}
}


void Count(const Node *l)
{
Node *p;
Man *q;
int a[3][2]={0};
p=l->cd;
while(p)
{
q=p->adj;
while(q)
{
if(q->name=='S')
{
a[0][0]++;
a[0][1]+=q->hp;
}
else if(q->name=='W')
{
a[1][0]++;
a[1][1]+=q->hp;
}
else if(q->name=='E')
{
a[2][0]++;
a[2][1]+=q->hp;
}
q=q->next;
}
p=p->cd;
}


printf("%d %d\n",a[0][0],a[0][1]);
printf("%d %d\n",a[1][0],a[1][1]);
printf("%d %d\n",a[2][0],a[2][1]);
printf("***\n");
}


int main()
{
// freopen("1107.txt","r",stdin);
int T;
int step;
Node *l;
scanf("%d",&T);
l=(Node*)malloc(sizeof(Node));
while(T--)
{
scanf("%d",&step);
Init(l);
while(step--)
{
Fight(l);
Move(l);
}
Count(l);
}
// fclose(stdin);
return 0;
}