問題を解決するためにA *を使用します。距離はdx + dy + 10 * dValue +移動距離で推定できます(これよりも短い方法は不可能です、下の例を参照)。 A *の考え方は、終点ノードを見つけるとすぐに、推定距離が最も短いノードを常に拡張することです。推定が距離を決して過大評価しない場合、これは機能します。ここでJS(fiddle)での実装です:
function solve(matrix, sRow, sCol, eRow, eCol) {
if (sRow == eRow && sCol == eCol)
return 0;
let n = matrix.length, m = matrix[0].length;
let d = [], dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]];
for (let i = 0; i < n; i++) {
d.push([]);
for (let j = 0; j < m; j++)
d[i].push(1000000000);
}
let list = [[sRow, sCol, 0]];
d[sRow][sCol] = 0;
for (;;) {
let pos = list.pop();
for (let i = 0; i < dirs.length; i++) {
let r = pos[0] + dirs[i][0], c = pos[1] + dirs[i][1];
if (r >= 0 && r < n && c >= 0 && c < m) {
let v = d[pos[0]][pos[1]] + 1 + 10 * Math.abs(matrix[pos[0]][pos[1]] - matrix[r][c]);
if (r == eRow && c == eCol)
return v;
if (v < d[r][c]) {
d[r][c] = v;
list.push([r, c, v + Math.abs(r - eRow) + Math.abs(c - eCol) + 10 * Math.abs(matrix[r][c] - matrix[eRow][eCol])]);
}
}
}
list.sort(function(a, b) {
if (a[2] > b[2])
return -1;
if (a[2] < b[2])
return 1;
return 0;
});
}
}
例えば答えは46であり、唯一の8ノードが展開得ています!
推定の例は、(0,0)からDに:( - 4 0)= 4
DYのSから
- 距離(0,0)22
- DX = ABSであります= ABS(0から2)= 2
- dValue = ABS(3 - 1)= 2
- 推定=距離+ DX + DY + 10 * dValue = 22 + 4 + 2 + 10 * 2 = 48
注:インプリメンテーションでは、xとyのinstedの行と列が使用されているため、スワップされていても問題はありません。
「ロボット」と「男」は同じですか?第2のケースでは「m」と「n」とは何ですか?彼らは2つのノードのノードコストですか? – Codor
@コーダー、私はそれをクリアしたはずです。それを指摘してくれてありがとう。はい、人とロボットは同じことです。 'm'と 'n'は2つのノードのノードコストです。 –
@maraca、書いてくれてありがとう。 SとDのコストは「1」です。また、私はもう一つの制約をこの問題に加えました。見て、提案してください。 –