この種の問題の「距離」の定義は常に注意が必要です。
ポイントがフィールド上のマークであり、自由にその中を歩くことができると想像してください。次に、あるポイントから別のポイントへの任意のパスを取ることができます。その場合、最短ルートは直線になります。その長さは、ポイントを結合するベクトルの長さになります。これは、たまたま2つのポイントの位置間の差ベクトルです。この長さは、ピタゴラスの定理を使用して計算できますdist = sqrt((x2-x1)^2 + (y2-y1)^2)
。これは、ポイント間のユークリッド距離として知られています。
今、あなたが都市にいて、各ポイントが建物であると想像してください。建物の上を歩くことはできないので、上/下または左/右に行くしかありません。次に、最短距離は、差ベクトルの成分の合計によって与えられます。これは、「2ブロック下がってから、左に1ブロック下がる」という数学的な言い方で、3ブロックの距離を歩くことを意味しますdist = abs(x2-x1) + abs(y2-y1)
。これは、ポイント間のマンハッタン距離として知られています。
ただし、あなたの問題では、対角線が許可されている場合、単一のステップで隣接するポイントにジャンプすることが唯一の可能な移動であるように見えます。次に、パスが非常に不規則であるため、問題は少し複雑になります。ここにはいくつかのグラフ理論が必要です。これは、リンクされた要素、つまり「ノード」に関する問題をモデル化するときに非常に役立ちます。各ポイントは隣接ノードに接続されたノードであり、問題は別の特定のポイントへの最短パスを見つけることです。ジャンプの重みが異なる場合(たとえば、対角線でのジャンプが難しい場合)、これを解決する簡単な方法は、ダイクストラのアルゴリズムを使用することです。ウィキペディアでの実装の詳細。
コストが常に同じである場合、問題は、ソースからの宛先ポイントの幅優先探索でのジャンプの数をカウントすることになります。