これは、多くの人が手動で解決した一般的なパズルです。これが、同じことを解決するアルゴリズムを書く時です。
同数のマッチ棒が、お互いの方向を向いた2つの異なる側面に並んでいます。それらの間に単一の空のスペースがあります。次の図のように言います(マッチ棒の総数が4の場合)。
各スティックは、前の方向に1ステップスライドするか(すぐ前のスペースが空いている場合)、またはスティックを前に1スティック飛び越えて、空いているスペースに着地することができます(そのスペースが空いている場合)。逆方向への移動はできません(スペースが空いていても)。リバースジャンプも許可されていません。1つのステップで許可される移動は1つだけです。
ここで、すべての左側のマッチスティックが右側に着地し、すべての右側のマッチスティックが左側に着地するために必要な最小ステップを見つけるアルゴリズムを記述する必要があります。
例:マッチスティックが2つある場合(両側に1つずつ)、ステップは次のようになります。
注:上の図では、左側のスティックが最初に移動されています。右側のスティックが最初に動くときに別の解決策が存在します。しかし、この問題では、1つのソリューションのみを与える必要があります。これは、左側のスティックが最初に動くことを前提としています。
次の図は、4つのマッチスティック(各サイドに2つ)を使用した動きを示しています。
注:上の図では、左側のスティックが最初に移動されています。右側のスティックが最初に動くときに別の解決策が存在します。しかし、この問題では、1つのソリューションのみを与える必要があります。これは、左側のスティックが最初に動くことを前提としています。
[仮定:入力は、02から14までの任意の偶数にすることができます(つまり、両側に1から7のマッチスティック)。この範囲外の入力の場合、検証を行う必要はなく、エラーメッセージを提供する必要もありません。注:出力では、各ステップは「|」で区切られています (パイプ)キャラクター。COBOLプログラマーは常にPIC 9(2)を入力サイズとして想定し、出力が最大長450文字で、右側にスペースが埋め込まれていると想定する場合もあります。]
入力例:
02
出力例:
01To02|03To01|02To03|
入力例:
04
出力例:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
入力例:
06
出力例:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|