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;
}
- HDU 1107
- HDU 1107 武林
- HDU 1107 武林
- 【模拟】HDU 1107 武林
- hdu 1107 武林【模拟】
- HDU 1107 武林(模拟)
- HDU 1107 武林
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- -- eclispe add plugins 出现:duplicate location 的情况
- 图论——HDOJ 1116
- Android 4.0 开发者指南(27) —— Resource Types - String
- ant引用外部文件中的属性
- Mac OS X 背后的故事
- HDU 1107
- SOAP协议的定义、传输和消息
- MFC入门(一)——MFC是一个编程框架
- Doppler天气雷达产品解析
- 拷贝购造函数,讲的很透彻易懂
- hdu 3555 Bomb【数位DP】
- Android学习笔记进阶1之MediaPlayer
- 使用SAX读取XML文件
- 本机plsql 连接虚拟机数据库 (win7虚拟机安装补充篇)