八皇后问题的Javascript实现
八皇后问题的Javascript实现。
直接上代码。
/* 八皇后问题: 建模: A 皇后横直不兼容:故每一排每一列最多只能有一个皇后,故每组答案可以简化为一个数组,如:[0, 4, 7, 5, 2, 6, 1, 3] B 判断条件可以简化为是否存在斜吃就行。 C 用递归实现 */ function queens(n) { function isOk(arr, m) { //前m-1个皇后相安无事的情况下,判断第m个是否也相安无事 for (var i = 0; i < m; i++) { if (Math.abs(arr[i] - arr[m]) == m - i) return false; } return true; } var ret = []; function getQueens(arr, m) {//前m-1个皇后相安无事的情况下,安排后面皇后的位置。 arr = [...arr] if (m == n - 1) { //判断最后一个皇后是否和谐 if (isOk(arr, m)) ret.push([...arr]); return; } for (var i = m; i < n; i++) { //递归下一轮 var temp = arr[m]; arr[m] = arr[i]; arr[i] = temp; if (isOk(arr, m)) getQueens(arr, m + 1); } } var arr = []; for (var i = 0; i < n; i++) arr[i] = i; getQueens(arr, 0); return ret; } function test(n) { var d0 = new Date(); var qs = queens(n); console.log(qs); var d1 = new Date(); console.log(n + '皇后,共 ' + qs.length + ' 组解。耗时:' + (d1 - d0)); } test(3); test(4); test(5); test(6); test(7); test(8); test(9); test(10);
另:这位网友有更简洁的代码,性能上与本文代码略有差异:https://www.jb51.net/article/86413.htm