首页 新闻 会员 周边 捐助

Python题,求大神

0
悬赏园豆:100 [已解决问题] 解决于 2016-06-24 09:58
  • 在一个有19个格子的武林世界里,小许飞刀和朱留香两位大侠在为独霸武林而互相厮杀。武林世界的第一个格子的编号是1,最后一个格子的编号为19。
  • 小许飞刀总是在来回不停地一格一格地行走,先往右走,走到头不能再走时就往左走,再到头则又往右走……比如,17->18->19->18……。
  • 轻功很好的朱留香总是在来回不停地两格两格地跳,先往右跳,跳到头不能再跳时就往左跳,再到头则又往右跳…比如,17->19->17->15……。
  • 每名大侠有内力、武艺、和生命力三种属性。这三种属性的取值范围一开始都是大于等于0,小于等于100。
  •   当两名大侠进入同一个格子时,一定会发生一次战斗,而且也只有在这种情况下,才会发生战斗。 一次战斗的结果将可能导致参战双方生命力发生变化,计算方法为:
  • 战后生命力 = 战前生命力 - 对方攻击力
  • 而不同大侠的攻击力计算方法不同:
  • 小许飞刀的攻击力 = (0.5 * 内力 + 0.5 * 武艺) * (战前生命力 + 10) / 100
  • 朱留香的攻击力 = (0.2 * 内力 + 0.8 * 武艺) * (战前生命力 + 10) / 100
  • 对攻击力的计算过程为小数运算,最终结果去掉小数部分后再取整,使得攻击力总是整数。 一次战斗结束后,生命力变为小于或等于0的人,被视为“战死”,尸体会留在这个格子中不能移动。 两名大侠相遇时,只发生一次战斗。 战斗完了接着走。 初始状态下,不存在生命值小于或等于0的人。
  •  一系列战斗从初始状态就可能爆发,全部战斗结束后,仍然活着的人才开始继续走。总之,不停地战斗-行走-战斗-行走……。 你需要做的是,从一个初始状态,算出经过N步(N < 1000)后的状态。所有的人进行完全部战斗(当然也可能没有任何战斗发生),然后再一齐或走或跳,这称为一步。
  •   输入:
  • 第一行是行走步数 N。 接下来的若干行,每行描述一名大侠的位置及其各项参数。格式为“大侠代号 格子编号 内力 武艺 生命力”。大侠代号就是一个字母: ‘X’ 代表小许飞刀 ‘Z’ 代表朱留香
  • 比如: X 10 10 3 10 表示小许飞刀一开始在第10个格子中,他的内力是 10,武艺是3,生命力是10。
  •   输出:
  • 针对每组测试数据,您的输出应该是2行,每行有空格分隔的三个值,第一个是大侠代号,第二个是他所在格子编号,第三个是现存生命力。输出文件的名字是‘学号.txt’,假设你的学号是15010101,则输出文件的名字就是‘15010101.txt’。
  • 假设in.txt文件中内容为:
  • 40
  • X 7 50 40 100
  • Z 10 50 40 100
  • 则输出文件内容应该为:
  • X 11 10
  • Z 4 -5
摩尔宝宝的主页 摩尔宝宝 | 初学一级 | 园豆:112
提问于:2016-06-21 19:35
< >
分享
最佳答案
1

初始状态怎么弄?都在第1个格上么?

鄙人还是先说一下思路吧:

这个问题难点在于这两位大侠的相遇计算, 1-19格子需要来回的走,略复杂。

假如弄一个数组 arr = [1..18 19 18..2](环)  这样,不就是循环了吗?  arr[index % size] 就是当前所在的格子号。

(index是数组下标而不是格子号)

index对于小李飞刀来说 每次 index ++, 对于朱(楚?)留香来说,每次 index += 2 (跳)?

arr[index % size] 两个人的格子号相等的时候就干一架就可以了? 血量啥的弄个变量记着就可以了。

 

这样?

 

收获园豆:100
之奇一昂 | 小虾三级 |园豆:1421 | 2016-06-22 08:17
 1 class Person(object):
 2   def __init__(self, name, power, skill, blood):
 3     self.name  = name
 4     self.power = power 
 5     self.skill = skill 
 6     self.blood = blood 
 7 
 8   # calculate attack damage
 9   def attackDamage(self):
10     return (.5 * self.power + .5 * self.skill) * (self.blood + 10) / 100
11 
12 if __name__ == '__main__':
13   x = Person("X", 10, 10, 100)
14   z = Person("Z", 20, 10, 100)
15 
16   # generate grid arr
17   gridArr = [i for i in range(1, 20)] + [i for i in range(18, 1, -1)]
18   gridSize = len(gridArr) 
19   # start index
20   xstep = 3 
21   zstep = 0
22 
23   # meet count
24   count = 100 
25 
26   i = 0
27   xGridValue = None
28   zGridValue = None
29   while i < count:
30     i = i + 1 
31     xstep = xstep + 1
32     zstep = zstep + 2
33     xGridValue = gridArr[xstep % gridSize]
34     zGridValue = gridArr[zstep % gridSize]
35     if xGridValue == zGridValue :
36       # generate attack damage before attack happen 
37       xAttackDamage = x.attackDamage()
38       zAttackDamage = z.attackDamage()
39 
40       if x.blood > 0 and z.blood >0:
41         z.blood = z.blood - xAttackDamage
42         x.blood = x.blood - zAttackDamage
43 
44       print("%s %3d %3d %3d %3d" %(x.name, xGridValue, x.power , x.skill , x.blood ))
45       print("%s %3d %3d %3d %3d" %(z.name, zGridValue, z.power , z.skill , z.blood ))
46     
View Code

死了也会走,但是不会攻击了,

没验证是不是正确,只是验证了一下自己的思路

之奇一昂 | 园豆:1421 (小虾三级) | 2016-06-22 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册