前提・実現したいこと
Javascriptで配列の要素に配列を組み込んで一本の配列にして出力することを検討しています。
[[0, 4, 2, 3, 5, 1], [0, 2, 4, 3, 5, 1],
[0, 2, 3, 4, 5, 1], [0, 2, 3, 4, 1, 5],
[0, 2, 3, 1, 4, 5], [0, 2, 1, 3, 4, 5],
[0, 1, 2, 3, 4, 5]]
理想としてはこのように配列の要素が配列になることを目指しています。
この配列をansとしたらans.lengthは7になっていてほしいです。
//追記//
配列を受け取り幅優先探索で上記の結果のように並び替え、結果を一本の配列として出力したいです。
該当のソースコード
/配列aのi番目とi+1番目の要素を入れ替えた配列を返す関数/ function swap(a, i, n){ var ax = a.slice(0); var tmp = ax[i]; var ii = (i + 1) % n; ax[i] = ax[ii]; ax[ii] = tmp; return ax; } /配列の並びが最終系になっているかの確認/ function is_goal(a){ var n = a.length; for (var i = 0; i < n; i++){ if (a[i] != i) return false } return true } /二つの配列を引数とし要素が同じであるかを調べる/ function eq_pat(q1, q2){ var n = q1.length; for (var i = 0; i < n; i++){ if (q1[i] != q2[i]) return false } return true; } /根からノードに向けてのパターンの出力/ function print_path(m) { var ans=[]; if (m != null) { print_path(m[2]); ans.push(m[1]) console.log(ans) } } /queueの要素:[木の深さ、パターン、親のノード]/ function bfs(list){ var queue = [[0, list, null]] while (true){ var m = queue.shift(); var n=list.length; var d = m[0]; var pat = m[1]; var parent = m[2]; if (is_goal(pat)) break; for (var i = 1; i < n; i++){ var patx = swap(pat, i, n); if (parent != null && eq_pat(patx, parent[1])) continue; queue.push([d + 1, patx, m]); } } print_path(m); } bfs([0,4,2,3,5,1])
試したこと
上記のソースコードはひとつのサンプルで最初に空の配列を用意してそこにpushで配列を追加していくことを考えたのですが
出力結果が
[[0,4,2,3,5,1]]
[[0,2,4,3,5,1]]
[[0,2,3,4,5,1]]
[[0,2,3,4,1,5]]
[[0,2,3,1,4,5]]
[[0,2,1,3,4,5]]
[[0,1,2,3,4,5]]
のようになり期待した結果が得られませんでした。
解決策をご教授のほどよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー