注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fudq's AC Road

何以解忧,唯有AC!

 
 
 

日志

 
 

hdu 1107  

2013-01-19 20:57:37|  分类: ACM-hdu |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://acm.hdu.edu.cn/showproblem.php?pid=1107
题意:中文题,题意好理解,题目有点长。。。。
解法:比较难的模拟题。刚开始打的代码老是wrong,有个地方想错了,会在后面贴上错误的代码,并附上错误的地方。
AC代码:

/*
* test.cpp
*
* Created on: 2013-01-19
*/
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
#define N 1010
int f[15][15];
struct Node{
//sign表示弟子代号,1代表少林,2代表武当,3代表峨嵋;a和b表示坐标;neili表示内力值;wuyi表示武艺值;live表示生命值
//t=1,表示少林弟子往下走,武当弟子往右走,峨嵋弟子往右下走;t=2相反
int sign,a,b,neili,wuyi,live,t;
}node[N];
int num;

void update_live()
{
int i,j,k,t1,t2;
double g1,g2;

//找到一个只有两个弟子的格子
for(i=1;i<=12;i++)
for(j=1;j<=12;j++)
{
if(f[i][j]!=2)
continue;
//找到这两个弟子的编号,记在t1和t2
t1=-1;t2=-1;
for(k=0;k<num;k++)
{
if(node[k].a==i && node[k].b==j)
{
if(t1==-1)
t1=k;
else
t2=k;
}
}
if(node[t1].sign==node[t2].sign)//同一门派不决斗
continue;
//决斗并更新生命值
if(node[t1].sign==1)
g1=(0.5*node[t1].neili+0.5*node[t1].wuyi)*(node[t1].live+10)/100.0;
else if(node[t1].sign==2)
g1=(0.8*node[t1].neili+0.2*node[t1].wuyi)*(node[t1].live+10)/100.0;
else
g1=(0.2*node[t1].neili+0.8*node[t1].wuyi)*(node[t1].live+10)/100.0;

if(node[t2].sign==1)
g2=(0.5*node[t2].neili+0.5*node[t2].wuyi)*(node[t2].live+10)/100.0;
else if(node[t2].sign==2)
g2=(0.8*node[t2].neili+0.2*node[t2].wuyi)*(node[t2].live+10)/100.0;
else
g2=(0.2*node[t2].neili+0.8*node[t2].wuyi)*(node[t2].live+10)/100.0;
node[t1].live-=(int)g2;
node[t2].live-=(int)g1;
}
}

void update_pos()
{
int i;
for(i=0;i<num;i++)
{
if(node[i].live <= 0)//已经死了就不再计算
continue;
if(node[i].sign==1)
{
if(node[i].a==12)
node[i].t=-1;
if(node[i].a==1)
node[i].t=1;
node[i].a+=node[i].t;
}
else if(node[i].sign==2)
{
if(node[i].b==12)
node[i].t=-1;
if(node[i].b==1)
node[i].t=1;
node[i].b+=node[i].t;
}
else
{
if((node[i].a==12 && node[i].b==1) || (node[i].a==1 && node[i].b==12))
continue;
if(node[i].a==12 || node[i].b==12)
node[i].t=-1;
if(node[i].b==1 || node[i].a==1)
node[i].t=1;
node[i].a+=node[i].t;
node[i].b+=node[i].t;
}
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("testin.txt","r",stdin);
//freopen("testout.txt","w",stdout);
#endif
int T,i,n,sn,ss,wn,ws,en,es;
char str[2];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
getchar();
num=0;
memset(f,0,sizeof(f));
while(scanf("%s",str))
{
if(str[0]=='0')
break;
scanf("%d%d%d%d%d",&node[num].a,&node[num].b,&node[num].neili,&node[num].wuyi,&node[num].live);
f[node[num].a][node[num].b]++;
if(str[0]=='S')
node[num].sign=1;
else if(str[0]=='W')
node[num].sign=2;
else if(str[0]=='E')
node[num].sign=3;
node[num].t=1;
num++;
}
while(n--)
{
//!!!注意题意,所有的弟子先进行完全战斗(当然也可能没有任何战斗发生),然后再一齐走到下一个格子,这称为一步。
update_live();
update_pos();
memset(f,0,sizeof(f));//!!!走完一步后,更新f数组:先清空数组f,然后把还活着的弟子所在位置加上(想错的地方)
for(i=0;i<num;i++)
if(node[i].live>0)
f[node[i].a][node[i].b]++;
}
sn=0;wn=0;en=0;ss=0;ws=0;es=0;
for(i=0;i<num;i++)
{
if(node[i].live<=0)
continue;
if(node[i].sign==1)
{
sn++;
ss+=node[i].live;
}
else if(node[i].sign==2)
{
wn++;
ws+=node[i].live;
}
else
{
en++;
es+=node[i].live;
}
}
printf("%d %d\n%d %d\n%d %d\n***\n",sn,ss,wn,ws,en,es);
}
return 0;
}

Wrong Answer代码(错误操作:更新f数组:战斗结束后,把每次战斗中战死的弟子所在位置减一;在进行行走之前,先把所有还活着的弟子所在位上减一,行走完后在新的位置上加一。):

/*
* test.cpp
*
* Created on: 2013-01-19
*/
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
#define N 1010
int f[15][15];
struct Node{
//sign表示弟子代号,1代表少林,2代表武当,3代表峨嵋;a和b表示坐标;neili表示内力值;wuyi表示武艺值;live表示生命值
//t=1,表示少林弟子往下走,武当弟子往右走,峨嵋弟子往右下走;t=2相反
int sign,a,b,neili,wuyi,live,t;
}node[N];
int num;

void update_live()
{
int i,j,k,t1,t2;
double g1,g2;

//找到一个只有两个弟子的格子
for(i=1;i<=12;i++)
for(j=1;j<=12;j++)
{
if(f[i][j]!=2)
continue;
//找到这两个弟子的编号,记在t1和t2
t1=-1;t2=-1;
for(k=0;k<num;k++)
{
if(node[k].a==i && node[k].b==j)
{
if(t1==-1)
t1=k;
else
t2=k;
}
}
if(node[t1].sign==node[t2].sign)//同一门派不决斗
continue;
//决斗并更新生命值
if(node[t1].sign==1)
g1=(0.5*node[t1].neili+0.5*node[t1].wuyi)*(node[t1].live+10)/100.0;
else if(node[t1].sign==2)
g1=(0.8*node[t1].neili+0.2*node[t1].wuyi)*(node[t1].live+10)/100.0;
else
g1=(0.2*node[t1].neili+0.8*node[t1].wuyi)*(node[t1].live+10)/100.0;

if(node[t2].sign==1)
g2=(0.5*node[t2].neili+0.5*node[t2].wuyi)*(node[t2].live+10)/100.0;
else if(node[t2].sign==2)
g2=(0.8*node[t2].neili+0.2*node[t2].wuyi)*(node[t2].live+10)/100.0;
else
g2=(0.2*node[t2].neili+0.8*node[t2].wuyi)*(node[t2].live+10)/100.0;

node[t1].live-=(int)g2;
node[t2].live-=(int)g1;
//如果有弟子死了,则从武林中消失(原来的做法)
if(node[t1].live <= 0)
f[node[t1].a][node[t1].b]--;
if(node[t2].live <= 0)
f[node[t2].a][node[t2].b]--;

}
}

void update_pos()
{
int i;
for(i=0;i<num;i++)
{
if(node[i].live <= 0)//已经死了就不再计算
continue;
f[node[i].a][node[i].b]--;//离开原来位置要减1(原来的做法)
if(node[i].sign==1)
{
if(node[i].a==12)
node[i].t=-1;
if(node[i].a==1)
node[i].t=1;
node[i].a+=node[i].t;
}
else if(node[i].sign==2)
{
if(node[i].b==12)
node[i].t=-1;
if(node[i].b==1)
node[i].t=1;
node[i].b+=node[i].t;
}
else
{
if((node[i].a==12 && node[i].b==1) || (node[i].a==1 && node[i].b==12))
continue;
if(node[i].a==12 || node[i].b==12)
node[i].t=-1;
if(node[i].b==1 || node[i].a==1)
node[i].t=1;
node[i].a+=node[i].t;
node[i].b+=node[i].t;
}
f[node[i].a][node[i].b]++;//到新位置上要加1(原来的做法)
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("testin.txt","r",stdin);
//freopen("testout.txt","w",stdout);
#endif
int T,i,n,sn,ss,wn,ws,en,es;
char str[2];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
getchar();
num=0;
memset(f,0,sizeof(f));
while(scanf("%s",str))
{
if(str[0]=='0')
break;
scanf("%d%d%d%d%d",&node[num].a,&node[num].b,&node[num].neili,&node[num].wuyi,&node[num].live);
f[node[num].a][node[num].b]++;
if(str[0]=='S')
node[num].sign=1;
else if(str[0]=='W')
node[num].sign=2;
else if(str[0]=='E')
node[num].sign=3;
node[num].t=1;
num++;
}
while(n--)
{
update_live();
update_pos();
}
sn=0;wn=0;en=0;ss=0;ws=0;es=0;
for(i=0;i<num;i++)
{
if(node[i].live<=0)
continue;
if(node[i].sign==1)
{
sn++;
ss+=node[i].live;
}
else if(node[i].sign==2)
{
wn++;
ws+=node[i].live;
}
else
{
en++;
es+=node[i].live;
}
}
printf("%d %d\n%d %d\n%d %d\n***\n",sn,ss,wn,ws,en,es);
}
return 0;
}


  评论这张
 
阅读(163)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018