问一个算法题,有点不知道怎么做,囚徒逃离岛屿问题

shiter
人工智能领域优质创作者
博客专家认证
2019-11-16 12:48:14
加精
有一个岛屿,中间一条通路连接两个码头,到两端的码头才可以逃脱,通路只能过一个人。
每个人都有自己的战斗力,自己的绝对值就是战斗力,不同方向的人遇到后会决斗,留下的战斗力为绝对值相减,保留到战斗力绝对值大的人身上,比如8和-2相遇那么8 就变成6。
给定一个数组:
#正数表示向右→
#负数表示向左←


样例输入:

test_cast = '[5 10 8 -8 -5]'

输出:[5,10] 表明最后这俩可以逃出升天

test_cast = '[ -1 -5]'

输出:[-1,-5] 表明最后这俩可以逃出升天,同向的都可以走出去,类似一秒移动一个单位那么他们都遇不到

test_cast = '[1 -1]'

输出:[] 表明最后这俩同归于尽




#先进行两个方向的遍历:
#从右到左,先看数组末尾的正数,肯定出去了
#从左到右,看数组头的负数,肯定出去了

再对剩下的进行处理,我怎么感觉好像 可以用递归,求大牛给个 样例代码,学习一下。
...全文
4369 45 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
cztone 2020-09-09
  • 打赏
  • 举报
回复
详细的更好,或者来个图.
  • 打赏
  • 举报
回复
https://blog.csdn.net/qq_34262886/article/details/107814976,思路在这
冰风漫天 2020-02-04
  • 打赏
  • 举报
回复

def run(a):
    print('a==%s'%a)
    result = []
    arr = []
    for x in a:
        if len(arr) == 0:
            if x<0:
                result.append(x)
            else:
                arr.append([x,x])
        else:
            if x < 0:
                s = x
                while s < 0:
                    if len(arr) == 0:
                        result.append(x)
                        break

                    last = arr.pop(-1)
                    s += last[1]
                    if s > 0:
                        last[1] = s
                        arr.append(last)
            else:
                arr.append([x,x])
    result.extend([r[0] for r in arr])
    print(result)

run([5, 10, 8, -8, -5])
run([-1, -5])
run([1, -1])
run([5, -10, 8, -8, -5])
a==[5, 10, 8, -8, -5] [5, 10] a==[-1, -5] [-1, -5] a==[1, -1] [] a==[5, -10, 8, -8, -5] [-10, -5]
nangongxiaobai 2020-01-07
  • 打赏
  • 举报
回复
引用 1 楼 shiter 的回复:
test_cast = '[5 10 8 -8 -5]' 下一个阶段是: 8 和-8 相遇,同归于尽 5 10 -5 再下一个 阶段,10和-5 相遇 剩下5 最终两人站点力5,5 但是要输出【5 10】,也就是原始两人的战斗力
没看懂题目,所以问下这为兄台,为什么是8和-8相遇,10和-5相遇?也就是我没明白这个相遇的规则是什么。谢谢
引用 1 楼 shiter 的回复:
test_cast = '[5 10 8 -8 -5]' 下一个阶段是: 8 和-8 相遇,同归于尽 5 10 -5 再下一个 阶段,10和-5 相遇 剩下5 最终两人站点力5,5 但是要输出【5 10】,也就是原始两人的战斗力
没看懂题目,所以问下这为兄台,为什么是8和-8相遇,10和-5相遇?也就是我没明白这个相遇的规则是什么。谢谢
Ye同学 2020-01-06
  • 打赏
  • 举报
回复
大神真多👍👍👍,👍👍👍
天枢子 2019-12-26
  • 打赏
  • 举报
回复
围观学习下
dabingsou 2019-12-02
  • 打赏
  • 举报
回复
来个暴力循环吧,有兴趣的可以改成加栈优化
def test(test_num):
  test_cast = []
  i=0
  for n in test_num:
    test_cast.append({'i':i,'ori':n,'new':n})
    i+=1
  while True:
    flag=False
    last = None
    for i in test_cast:
      if i['new']>0:
        last=i
      elif i['new']==0 or (not last and i['new']<0):
        continue
      else:
        flag= True
        if i['new']+last['new']==0:
          i['new']=0
          last['new']=0
        elif i['new']+last['new']>0:
          last['new']=i['new']+last['new']
          i['new']=0
        else:
          i['new']=i['new']+last['new']
          last['new']=0
        if last['new']==0: break

    if not last or not flag:
      return test_cast

test_num = [5, -10, 8, -8, -5]
for i in test(test_num):
  if i['new']>0 or i['new']<0:
    print (i)
      
        
zjcxc 2019-12-02
  • 打赏
  • 举报
回复
1,-1,1
用放格子的方法表示一下,如下所示(也就是我前面说的隐藏信息,第几个数字代表它所在的当前位置)
1 ------------ 第一个数
-- -1 -------- 第二个数
----------1-- 第三个数

然后移动一次
--1 ----------- 正数右移
-1 ----------- 负数左移
-------------1 正数右移
可以看到 ,移动后第1和第2个数字位置相同,也就是它们相遇,战斗力相同,所以它们都没了,只剩下第3个数字1,它出去了

shiter 2019-12-02
  • 打赏
  • 举报
回复
引用 38 楼 脆皮大雪糕 的回复:
[quote=引用 36 楼 shiter 的回复:] [quote=引用 34 楼 脆皮大雪糕 的回复:] [quote=引用 30 楼 zjcxc--个人微信公共号同名 的回复:] 楼上的不对吧,如果是 [-1,1] ,这个的累加值也是0,但两个显然不会相遇,应该都输出
按照题意,不会出现这种情况[/quote] [-1,1] 的这个情况是会有的,两个人都走出去了啊[/quote] 那么 [1,-1,1] 这个输入应该怎么判定?到底是右边那个1跑了还是说这三个人都在管子左边,-1可以在管子外面让过所有的1,于是大家都跑了皆大欢喜? 根据题主给出的输入规则和案例,这个一维数组唯一能够区分方向的就是正负分界点,并且这个分界点只能有一个。 如果非要说最左侧可以有负数,最右侧可以有正数,那就是在我那个算法的之前再嵌套一层把两端的这种情况剥离出来再说咯。[/quote] [1,-1,1] 这个输入应该怎么判定?到底是右边那个1跑了 只有1 跑了
风过不留声 2019-11-28
  • 打赏
  • 举报
回复
1,-1,1 这个就是和一个1右移,第2仆-1左移,所以相遇两个都没了 第3个1右移出去了 所以最终结果是1
zjcxc 2019-11-25
  • 打赏
  • 举报
回复
1,-1,1
这个就是和一个1右移,第2仆-1左移,所以相遇两个都没了
第3个1右移出去了
所以最终结果是1
脆皮大雪糕 2019-11-25
  • 打赏
  • 举报
回复
引用 36 楼 shiter 的回复:
[quote=引用 34 楼 脆皮大雪糕 的回复:] [quote=引用 30 楼 zjcxc--个人微信公共号同名 的回复:] 楼上的不对吧,如果是 [-1,1] ,这个的累加值也是0,但两个显然不会相遇,应该都输出
按照题意,不会出现这种情况[/quote] [-1,1] 的这个情况是会有的,两个人都走出去了啊[/quote] 那么 [1,-1,1] 这个输入应该怎么判定?到底是右边那个1跑了还是说这三个人都在管子左边,-1可以在管子外面让过所有的1,于是大家都跑了皆大欢喜? 根据题主给出的输入规则和案例,这个一维数组唯一能够区分方向的就是正负分界点,并且这个分界点只能有一个。 如果非要说最左侧可以有负数,最右侧可以有正数,那就是在我那个算法的之前再嵌套一层把两端的这种情况剥离出来再说咯。
shiter 2019-11-23
  • 打赏
  • 举报
回复
引用 34 楼 脆皮大雪糕 的回复:
[quote=引用 30 楼 zjcxc--个人微信公共号同名 的回复:] 楼上的不对吧,如果是 [-1,1] ,这个的累加值也是0,但两个显然不会相遇,应该都输出
按照题意,不会出现这种情况[/quote] [-1,1] 的这个情况是会有的,两个人都走出去了啊
脆皮大雪糕 2019-11-23
  • 打赏
  • 举报
回复
引用 30 楼 zjcxc--个人微信公共号同名 的回复:
楼上的不对吧,如果是 [-1,1] ,这个的累加值也是0,但两个显然不会相遇,应该都输出
按照题意,不会出现这种情况
刘之帅 2019-11-23
  • 打赏
  • 举报
回复
初步想,把和第一个元素同号的元素都压栈,设计一个指针(储存数据下标的变量)i指向第一个与首元素异号的元素。然后不断相加栈顶和a[i],结果与首元素同号就压栈并i++,异号就把结果存于a[i]。若栈空了说明数组剩下的能跑,若i==length,说明栈里的能跑。
晓晓1121 2019-11-22
  • 打赏
  • 举报
回复
引用 32 楼 shiter的回复:
[quote=引用 27 楼 末_枭 的回复:] 蛮力法解决的,没有使用到递归,就是判断和遍历 下面是代码,代码还需要优化。 https://blog.csdn.net/zhj_1121/article/details/103178012
请谨慎发表博客,此题涉及 知名公司版权[/quote] 好的,我这就删掉(凑字数凑字数)
shiter 2019-11-22
  • 打赏
  • 举报
回复
引用 27 楼 末_枭 的回复:
蛮力法解决的,没有使用到递归,就是判断和遍历 下面是代码,代码还需要优化。 https://blog.csdn.net/zhj_1121/article/details/103178012
请谨慎发表博客,此题涉及 知名公司版权
shiter 2019-11-22
  • 打赏
  • 举报
回复
有点厉害,看来这个题目的解法有很多,但是我没弄清归属哪一类数学问题?
zjcxc 2019-11-22
  • 打赏
  • 举报
回复
楼上的不对吧,如果是 [-1,1] ,这个的累加值也是0,但两个显然不会相遇,应该都输出
weixin_45908477 2019-11-21
  • 打赏
  • 举报
回复
感觉学到了呢
加载更多回复(25)

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧