成为九头蛇杀手


13

您是该地区最好,最著名的英雄。最近,有传言说九头蛇一直在附近的峡谷中闲逛。作为您的勇敢和善良的英雄,您会发现今天晚些时候可以去检查一下。

水合物的问题在于,每当您尝试切断其头部时,都会有一些新的头部长回来。幸运的是,您拥有可以一次切断多个头部的剑。但是要注意的是,如果九头蛇的头部少于刀口,那么您将无法攻击九头蛇。当九头蛇的头部完全为零时,您就杀死了它。

还有一把特殊的剑,叫做“平分器”,可以切断九头蛇一半的头,但前提是头数是偶数。当头数为奇数时,完全不能使用平分线。这与切断零头不同。

因此,您已经决定要编写一个计算机程序,以找出消灭九头蛇的最佳方法。

任务

您将获得输入

  • 九头蛇开始的头数
  • 九头蛇每回合的头数
  • 可供使用的剑列表(每把都是平分线或每回合切割固定数目的刀头)

您应该输出一个动作列表,该动作将在尽可能少的回合时间内杀死九头蛇。如果没有办法杀死九头蛇,那么您必须输出其他值来指示这样做(如果您的语言是强类型的,则可以使用空列表)。如果有多种消灭九头蛇的最佳方法,您可以输出其中任何一种或全部。

这是一个问题,因此答案将以字节计分,而字节越少越好。

测试用例

可根据要求提供更多

5 heads, 9 each turn,  [-1,-2,-5] -> [-5]
12 heads, 1 each turn, [/2,-1] -> No solution
8 heads, 2 each turn,  [-9, -1] -> [-1,-9]
3 heads, 23 each turn, [/2,-1,-26] -> [-1,-1,-26,-26,-26,-26,-26,-26,-26,-26]
16 heads, 1 each turn, [/2, 4, 2] -> [/2,-4,/2,-4]

这个问题是HydraSlayer主要机制的简化版本。如果您喜欢这种类型的拼图,我建议您将其检出,这很有趣。我与游戏没有任何隶属关系。


1
每回合增加的头的数量是恒定的,是吗?不依赖于切断头的数量吗?
KSmarts

1
@KSmarts是的。
Ad Hoc Garf Hunter

如果等分线仅在头数为偶数的情况下起作用,这是否意味着在头数奇数的情况下它什么也不做?@ThePirateBay的解决方案将是[/ 2,-26]
dj0wns

1
@ dj0wns 当平数为奇数时,将无法使用
Ad Hoc Garf Hunter

@Nnnes这似乎是正确的,顺便说一句[/2, -2, /2, -2, -4]也可行。
Ad Hoc Garf Hunter

Answers:


3

JavaScript中,230个 223字节

f=(h,t,s)=>{m=h-Math.min(...s),d=1,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>!(a=w?h+w:h/2)?d=w:!(a%1)&a>0&a<m&!f[a+=t]?f[q.push([...p,w],a),a]=1:0);d<1?(q=[],p).push(d):0}return d<1?p:[]}

_=_=>f=(h,t,s)=>{m=h-Math.min(...s),d=1,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>!(a=w?h+w:h/2)?d=w:!(a%1)&a>0&a<m&!f[a+=t]?f[q.push([...p,w],a),a]=1:0);d<1?(q=[],p).push(d):0}return d<1?p:[]}

console.log(`[${_()(5, 9,  [-1,-2,-5])}]`);
console.log(`[${_()(12, 1, [0,-1])}]`);
console.log(`[${_()(8, 2,  [-9,-1])}]`);
console.log(`[${_()(1, 2,  [0,-4])}]`);
console.log(`[${_()(3, 2,  [0,-4,-1])}]`);
console.log(`[${_()(3, 4,  [0,-4,-1])}]`);
console.log(`[${_()(3, 23, [0,-1,-26])}]`);
console.log(`[${_()(16, 1, [0,-4,-2])}]`);

非高尔夫版本:

f=(heads,turn,swords)=>{
  max=heads-Math.min(...swords);

  found=1;
  flags=[];
  queue=[];
  swords.map(a=>queue.push([],heads));

  while(queue.length){
    path=queue.shift();
    heads=queue.shift();

    swords.map(sword=>{
      after=sword?heads+sword:heads/2;

      if(!after){
        found=sword;
      }else if(!(after%1)&after>0&after<max&!flags[after+=turn]){
        flags[after]=1;
        queue.push([...path,sword],after);
      }
    });

    if(found<1){
      path.push(found);
      break;
    }
  }

  return found<1?path:[];
}

等分线表示为0

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.