CodeCombat计算机科学6.13黄金选择

在这里插入图片描述

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
  • 终于,搞定了,通关后代码还没有再去优化,今天先到这里了,大家有什么想法或思路欢迎留言!!!
    在这里插入图片描述
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值