CodeCombat计算机科学
——6.13黄金选择
先来上提示:
(平台的提示已经给大家基本思路了!!!)
第一步:遍历整行硬币并存储他们的值
(代码区已经给出来了)
1、这里template是一个二维数组:
-----数组中每个元素初始值设为0,一行有(2*coinLines-1)个元素,有 coinLine 行。该数组生成10行,19列
-----转换为c++语言也就是
- template [coinLine][2*coinLines-1]
刚开始我对python的这种创建二维数组的方法很想不通:
为什么不能这个样子?
- template[[0]*(2*coinLines-1)]*coinline
这样逻辑上是没有问题的,但是在python中这样构建的二维数组会出现一个“浅拷贝”问题,具体细节大家可以参考这篇图文内容,进行尝试
为了避免”浅拷贝“问题,所以在这里我们需要用生成器来生成二维数组
template = [[0 for j in range(2 * coinLines - 1)] for i in range(coinLines)]
2、int()的必要性(一定要取整)
row = int((coin.pos.y - zeroPoint.y) / distanceY)
col = int((coin.pos.x - zeroPoint.x) / distanceX)
3、看懂GoldMap数组
第二步:检查下一行,并将每个初始值和每个邻居相加
这个黄金地图上,一共有10条路径可以从下面到达出口,每条路径都是固定的,起点依次是
(0,0),(0,2),(0,4),(0,6),(0,8),
(0,10),(0,12),(0,14),(0,16),(0,18)
1、求每条路径走下来能获得的金币值
方法:用for循环以step=2遍历第一行,
这里我们便将将这一整块拆解为10个小问题
2、那么每条路径应该怎么走呢?
-每次只能从自己的原位置走到自己邻居的位置
-这里就需要分情况讨论了
-因为有的位置有两个邻居,而有的位置(在边缘处)只有一个邻居
-那们什么时候有两个邻居,什么时候有一个邻居呢?
-我们必须把这个条件表达出来:
-
如果当前位置的列数j<1,也就是说hero站在第0列上,那么此刻的hero在下一行只有右邻居(goldMap[i][j+1]),没有左邻居(goldMap[i][j-1])
-
如果当前位置的列数j>=18,也就是说hero站在第18列上,那么此刻的hero在下一行只有左邻居(goldMap[i][j-1]),没有右邻居(goldMap[i][j+1])
-
如果当前位置的列数“j<18 and j>=1”,也就是说hero站在第1列—第18列上,那么此刻的hero在下一行既有右邻居(goldMap[i][j+1]),也有左邻居(goldMap[i][j-1])
代码如下
if j<1:
sum+=goldMap[i][j+1]
j=j+1
elif j>=18:
sum+=goldMap[i][j-1]
j=j-1
elif j<18 and j>=1:
if goldMap[i][j-1]>=goldMap[i][j+1]:
sum+=goldMap[i][j-1]
j=j-1
else:
sum+=goldMap[i][j+1]
j=j+1
至此,你的一条路径已经测试出来了吧!
将这条测试路径捡到的gold总数记录下来
for起来,遍历每条路径
#定义函数遍历每条路径测试该路径的总gold
def textallroad(goldMap):
#road数组记录每条路径可获得的gold总和
roads=[]
sum=0
for p in range(coinLines):
#i表示第几行
i=0
#j表示第几列
j=p*2
#sum变量用来累加gold值
sum=0
#先加起始点的金币值
sum+=goldMap[0][j]
for n in range (coinLines-1):
#从第二行开始
i=i+1
if j<1:
sum+=goldMap[i][j+1]
j=j+1
elif j>=18:
sum+=goldMap[i][j-1]
j=j-1
elif j<18 and j>=1:
if goldMap[i][j-1]>=goldMap[i][j+1]:
sum+=goldMap[i][j-1]
j=j-1
else:
sum+=goldMap[i][j+1]
j=j+1
#至此该条路径已经走出去了,将该条路径的sum放在roads[]数组中
roads[p]=sum
hero.say(p+"point start will save"+sum)
#最后将该数组返回
return roads
这样哪条路径能得到最多的gold,只要用排序法筛选一下就可以了
最后,告诉你的hero哪条路最优就可以了!
3、查找roads[]数组中最大值
def findbestroad(roads):
maxsavestartpoint=None
maxsavemoney=0
i=0
for i in range (len(roads)):
if roads[i]>maxsavemoney:
maxsavestartpoint=i
maxsavemoney=roads[i]
return maxsavestartpoint
- 终于,搞定了,通关后代码还没有再去优化,今天先到这里了,大家有什么想法或思路欢迎留言!!!