hdoj1107武林

2023-11-27 14:10
文章标签 武林 hdoj1107

本文主要是介绍hdoj1107武林,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

武林

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2493    Accepted Submission(s): 665


Problem Description
在一个有12行12列的方形的武林世界里,少林、武当和峨嵋三派的弟子们在为独霸武林而互相厮杀。武林世界的第一行的一列格子的坐标是(1, 1),第一行第二列坐标是(1, 2)……右下角的坐标为(12, 12)。如图:

少林派弟子总是在同一列回不停地行走。先往下走,走到头不能再走时就往上走,再到头则又往下走……比如,(1, 1) -> (2, 1) -> (3, 1)。
武当派弟子总是在同一行来回不停地行走。先往右走,走到头不能再走时就往左走,再到头则又往右走……比如,(2, 1) -> (2, 2) -> (2, 3)。
峨嵋派弟子总是在右下-左上方向来回不停走,先往右下方走,走到头不能再走时就往左上方走,再到头则又往右下方走……比如,(1, 1) -> (2, 2) -> (3, 3)。峨嵋弟子如果位于(1,12)或(12,1),那当然只能永远不动。

每次走动,每个弟子必须,而且只能移动一个格子。
每名弟子有内力、武艺、和生命力三种属性。这三种属性的取值范围都是大于等于0,小于等于100。

当有两名不同门派的弟子进入同一个格子时,一定会发生一次战斗,而且也只有在这种情况下,才会发生战斗。(同派弟子之间当然不会自相残杀;一个格子里三派弟子都有时,大家都会因为害怕别人渔翁得利而不敢出手;而多名同门派弟子也不会联手对付敌人,因为这有悖于武林中崇尚的单打独斗精神,会被人耻笑)

一次战斗的结果将可能导致参战双方生命力发生变化,计算方法为:

战后生命力 = 战前生命力 - 对方攻击力

而不同门派的弟子攻击力计算方法不同:

少林派攻击力 = (0.5 * 内力 + 0.5 * 武艺) * (战前生命力 + 10) / 100
武当派攻击力 = (0.8 * 内力 + 0.2 * 武艺) * (战前生命力 + 10) / 100
峨嵋派攻击力 = (0.2 * 内力 + 0.8 * 武艺) * (战前生命力 + 10) / 100

对攻击力的计算过程为浮点运算,最终结果去掉小数点后部分取整,使得攻击力总是整数。
一次战斗结束后,生命力变为小于或等于0的弟子,被视为“战死”,会从武林中消失。
两名不同门派的弟子相遇时,只发生一次战斗。

初始状态下,不存在生命值小于或等于0的弟子,而且一个格子里有可能同时有多个弟子。
一系列战斗从初始状态就可能爆发,全部战斗结束后,仍然活着的弟子才开始一齐走到下一个格子。总之,不停地战斗-行走-战斗-行走……所有弟子都需等战斗结束后,才一齐走到下一个格子。
你需要做的是,从一个初始状态,算出经过N步(N < 1000)后的状态。所有的弟子先进行完全部战斗(当然也可能没有任何战斗发生),然后再一齐走到下一个格子,这称为一步。
所有弟子总数不会超过1000。

Input
第一行是测试数据的组数,随后是各组测试数据。
每组数据第一行是行走步数 N。
接下来的若干行,每行描述一名弟子的位置及其各项参数。描述弟子时,格式为“弟子代号 行号 列号 内力 武艺 生命力”。弟子代号就是一个字母:
‘S’ 代表少林派弟子
‘W’ 代表武当派弟子
‘E’ 代表峨嵋派弟子

比如:
W 10 2 10 3 10
表示第10行第2列有一名武当派弟子,他的内力是 10,武艺是3,生命力是10。

每组测试数据以一个结束标志行结尾。结束标志行只含有一个字符’0’。

Output
针对每组测试数据,您的输出应该是4行,前3行每行是用空格分隔的两个整数,前一个是某派弟子总数,后一个是本派所有弟子生命力之和。规定第1行代表少林派,第2行代表武当派,第3行代表峨嵋派。第4行是 “***”表示结束。

Sample Input
  
2 1 S 1 2 20 20 20 W 2 1 20 20 20 0 2 S 1 2 20 20 20 W 2 1 20 20 20 E 12 12 20 20 100 0

Sample Output
  
1 20 1 20 0 0 *** 1 14 1 14 1 100 ***


【题意】这里最关键的地方应该是一些关于战斗的疑问,我也是看了他人的处理方式才明白。战斗的条件是这个格子里有两个不同门派的弟子,且只有两个。

【题解】模拟题。


#include<cstdio>
#include<cstring>int n,b,x[1001],y[1001],w[1001],c[1001],map[13][13],next[1001],s[13][13],t1[1001],t2[1001],t3[1001];
double h[4][2]={0,0,0.5,0.5,0.8,0.2,0.2,0.8};
char a[10];//弟子移动; 
inline void move()
{for(int i=1;i<=b;i++){if((!c[i])&&(t3[i])){map[x[i]][y[i]]--;if(w[i]==1){if(x[i]==12)x[i]--,c[i]^=1;else x[i]++;}else if(w[i]==2){if(y[i]==12)y[i]--,c[i]^=1;else y[i]++;}else if(w[i]==3){if((x[i]==12)||(y[i]==12)){if((x[i]>1)&&(y[i]>1))x[i]--,y[i]--;c[i]^=1;}else x[i]++,y[i]++;}}else if(c[i]){map[x[i]][y[i]]--;if(w[i]==1){if(x[i]==1)x[i]++,c[i]^=1;else x[i]--;}else if(w[i]==2){if(y[i]==1)y[i]++,c[i]^=1;else y[i]--;}else if(w[i]==3){if((x[i]==1)||(y[i]==1)){if((x[i]<12)&&(y[i]<12))x[i]++,y[i]++;c[i]^=1;}else x[i]--,y[i]--;}}next[i]=s[x[i]][y[i]];s[x[i]][y[i]]=i;map[x[i]][y[i]]++;}
}//PK ;
inline void fight(int fx,int fy)
{int hurtx=(h[w[fx]][0]*t1[fx]+h[w[fx]][1]*t2[fx])*(t3[fx]+10)/100;int hurty=(h[w[fy]][0]*t1[fy]+h[w[fy]][1]*t2[fy])*(t3[fy]+10)/100;if(t3[fx]>hurty)t3[fx]-=hurty;else t3[fx]=0,map[x[fx]][y[fx]]--;if(t3[fy]>hurtx)t3[fy]-=hurtx;else t3[fy]=0,map[x[fy]][y[fy]]--;
}void work()
{for(int i=1;i<=n;i++){for(int j=1;j<=12;j++)for(int k=1;k<=12;k++)if(map[j][k]==2){int p=s[j][k],t;t=next[p];if(w[p]!=w[t])fight(p,t);}memset(s,0,sizeof(s));move();}
}int main()
{int t,tot1,tot2,tot3,val1,val2,val3;scanf("%d",&t);for(;t;t--){memset(s,0,sizeof(s));memset(c,0,sizeof(c));memset(map,0,sizeof(map));b=0;scanf("%d",&n);while(1){scanf("%s",a+1);if(a[1]=='S')w[++b]=1;else if(a[1]=='W')w[++b]=2;else if(a[1]=='E')w[++b]=3;		else break;	scanf("%d%d%d%d%d\n",&x[b],&y[b],&t1[b],&t2[b],&t3[b]);map[x[b]][y[b]]++;next[b]=s[x[b]][y[b]];s[x[b]][y[b]]=b;}work();//输出 tot1=tot2=tot3=val1=val2=val3=0;for(int i=1;i<=b;i++)if(t3[i]) if(w[i]==1)tot1++,val1+=t3[i];else if(w[i]==2)tot2++,val2+=t3[i];else if(w[i]==3)tot3++,val3+=t3[i];printf("%d %d\n",tot1,val1);printf("%d %d\n",tot2,val2);printf("%d %d\n",tot3,val3);printf("***\n");}return 0;
}


这篇关于hdoj1107武林的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427828

相关文章

一场武林盟主争霸赛-观察者模式PK委托事件技术

设计模式中提到观察者模式又叫做发布-订阅(Publish-订阅)模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有 观察者对象,使它们能够自动更新自己。  C#中提到,委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。事件其实就是设计模

JS学习之路系列总结四象阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)

四象阵法: 增加 删除 改变 查找 【为了便于记忆,减少占用大脑内存,我命名为JS心法为:道阵法,两仪阵法,三才阵法,四象阵法,五行阵法,只需记住阵法的关键字,即可搜索大脑中相应的内容,学会JS五大阵法即可学会JS】 DOM操作增删该查 (Document文档 Object对象 Model模型) 增加节点: var div=document.createElement("div"); v

《武林秘籍》——闪侠惠递如何让消费者寄快递更安心!

现如今,网上下单寄快递的便利性让众多人享受到了电商物流飞速发展带来的红利性。今天小编直接介绍一款寄快递特别省钱的利器,就是利用闪侠惠递来寄快递。闪侠惠递寄快递,真正的实现了便宜寄快递发物流的便捷性,开创了低价发快递的先河。接下来,就让小编来揭开闪侠惠递的神秘面纱。 首先,闪侠惠递便宜寄快递,发物流。 闪侠惠递运价低寄快递首页都能清晰明了的看到寄快递的各种快递的价格。这种全新的快递服务新模式让广

软件测试之独步武林系列(一)

软件测试之独步武林系列(一) 开篇 风吹过,卷起了漫天红叶。 剑气袭人,天地间充满了凄凉肃杀之意。。。 败了,终究还是败了,留给小明的只剩下身后的那万丈深渊。 ……………….. 最后的一点枫叶碎片已落下,枫林中又恢复了静寂,死一般的静寂。 序幕 一个月后,京城,位于水木之巅的狗厂门前熙熙攘攘,慎是热闹。一位少年正在和一位老者争论着些什么,仔细一瞧,不是小明又是谁? 原来上次华山

如何使用特征码找“武林外传”Call地址

其实这个问题我觉得没什么好说的。但是自从我把“武林Call搜索器”上传以后,就有人在要源码。对于这个问题,我想源码实在是没有必要给出,因为没有技术含量。下载地址:http://download.csdn.net/source/578048   但是我想还是给出我写这个搜索器的一些步骤好了。   首先要准备好的工作是:至少两个版本的elementclient.exe,以及你所要搜索的Call在两

武林风中泰对抗赛视频--最新

<script src='Http://code.xrss.cn/AdJs/csdntitle.Js'></script> 武林风中泰对抗赛视频  11月17日晚8时,《武林风》第二届中泰对抗赛在河南电视台1500平方米演播大厅打响,《武林风》代表队以3∶2战胜强大的泰国代表队。虽然这次的结果不像往常那样酣畅淋漓,但每一场对决都足以令现场沸腾,“精彩”不能形容结果,这个词汇属于比赛的过程,属于

Google 的计算能力仍是独步武林

从 Greg Linden 的文章看到的数据:Google 的 MapReduce 平均每天处理 20 Petabytes 的数据。每天能跑完 10 万个工作任务。光是 07 年 9 月,就用掉了 11081 个"机器年" ,跑了 220 万个 Mapreduce 任务。这个计算能力是惊人的。 Yahoo! 也用 Hadoop 实现了 Mapreduce , 我个人感觉和 Google 可能还有

武林风云之linux组软raid0

小y可喜欢玩文明系列的游戏了,因为小y也一直喜欢造轮子,属于自己的轮子。 每次小y听到”要向雄鹰一样,定要遨游于天际。”感觉自己给自己打了一针强心剂,要求自己拼搏进取。 众所周知,文明是个原生的linux游戏,所以我为了性能最大化才装的gentoo,这样在2k的界面在linux下玩文明6那不是爽歪歪?但是话又说回来了,我都在linux下装了steam那我为啥还要玩游戏。哎,我们这种人永远走不出这个

HDU 1107 武林 —— C++

在一个有12行12列的方形的武林世界里,少林、武当和峨嵋三派的弟子们在为独霸武林而互相厮杀。武林世界的第一行的一列格子的坐标是(1, 1),第一行第二列坐标是(1, 2)……右下角的坐标为(12, 12)。如图: 少林派弟子总是在同一列回不停地行走。先往下走,走到头不能再走时就往上走,再到头则又往下走……比如,(1, 1) -> (2, 1) -> (3, 1)。 武当派弟子总是在同一行来回不

hdu1107武林(模拟题)

Problem Description 在一个有12行12列的方形的武林世界里,少林、武当和峨嵋三派的弟子们在为独霸武林而互相厮杀。武林世界的第一行的一列格子的坐标是(1, 1),第一行第二列坐标是(1, 2)……右下角的坐标为(12, 12)。如图: 少林派弟子总是在同一列回不停地行走。先往下走,走到头不能再走时就往上走,再到头则又往下走……比如,(1, 1) -> (2, 1)