大佬教程收集整理的这篇文章主要介绍了JavaScript解八皇后问题的方法总结,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
关于八皇后问题的 JavaScript 解法,总觉得是需要学习一下算法的,哪天要用到的时候发现真不会就尴尬了
八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为 n×n ,而皇后个数也变成n 。当且仅当n = 1或n ≥ 4时问题有解
for(arr[0] = 1; arr[0] <= 4; arr[0]++) {
for(arr[1] = 1; arr[1] <= 4; arr[1]++) {
for(arr[2] = 1; arr[2] <= 4; arr[2]++) {
for(arr[3] = 1; arr[3] <= 4; arr[3]++) {
if(!check1(arr,4)) {
conTinue;
} else {
console.log(arr);
}
}
}
}
}
}
queen1();
//[ 2,4,1,3 ]
//[ 3,2 ]
关于结果,在 4*4 的棋盘里,四个皇后都不可能是在一排, arr[0] 到 arr[3] 分别对应四个皇后,数组的下标与下标对应的值即皇后在棋盘中的位置
function queen2() {
var arr = [];
for(arr[0] = 1; arr[0] <= 4; arr[0]++) {
for(arr[1] = 1; arr[1] <= 4; arr[1]++) {
if(!check2(arr,1)) conTinue; //摆两个皇后产生冲突的情况
for(arr[2] = 1; arr[2] <= 4; arr[2]++) {
if(!check2(arr,2)) conTinue; //摆三个皇后产生冲突的情况
for(arr[3] = 1; arr[3] <= 4; arr[3]++) {
if(!check2(arr,3)) {
conTinue;
} else {
console.log(arr);
}
}
}
}
}
}
queen2();
//[ 2,2 ]
具体代码如下,最外层while下面包含两部分,一部分是对当前皇后可能值的遍历,另一部分是决定是进入下一层还是回溯上一层
var k = 1; // 第n的皇后
arr[0] = 1;
while(k > 0) {
arr[k-1] = arr[k-1] + 1;
while((arr[k-1] <= n) && (!check2(arr,k-1))) {
arr[k-1] = arr[k-1] + 1;
}
// 这个皇后满足了约束条件,进行下一步判断
if(arr[k-1] <= n) {
if(k == n) { // 第n个皇后
console.log(arr);
} else {
k = k + 1; // 下一个皇后
arr[k-1] = 0;
}
} else {
k = k - 1; // 回溯,上一个皇后
}
}
}
首先来处理一个小问题,寻找相邻字符串:拿到几组字符串数组,每个数组拿出一个字符串,前一个字符串的末位字符与后一个字符串的首位字符相同,满足条件则输出这组新取出来的字符串
// 约束条件方法
function linked(s1,s2) {
return s1.slice(-1) == s2.slice(0,1);
}
// 注入数据列表
var w1 = amb(["the","that","a"]);
var w2 = amb(["frog","elephant","thing"]);
var w3 = amb(["walked","treaded","grows"]);
var w4 = amb(["slowly","quickly"]);
// 执行程序
if (!(linked(w1,w2) && linked(w2,w3) && linked(w3,w4))) fail();
console.log([w1,w2,w3,w4].join(' '));
// "that thing grows slowly"
});
看起来超级简洁有没有!不过使用的前提是,你不在乎性能,它真的是很浪费时间!
下面是它的 javascript 实现,有兴趣可以研究研究它是怎么把回溯抽出来的
function amb(values) {
if (values.length == 0) {
fail();
}
if (index == choices.length) {
choices.push({i: 0,count: values.length});
}
var choice = choices[index++];
return values[choice.i];
}
function fail() { throw fail; }
while (true) {
try {
index = 0;
return func(amb,fail);
} catch (E) {
if (e != fail) {
throw e;
}
var choice;
while ((choice = choices.pop()) && ++choice.i == choice.count) {}
if (choice == undefined) {
return undefined;
}
choices.push(choicE);
}
}
}
以及使用 amb 实现的八皇后问题的具体代码
console.log(queens(8));
// 输出结果:
// [ [ 1,5,8,6,3,7,2,4 ],// [ 1,5 ],// ...
// [ 8,// [ 8,5 ] ]
八皇后问题有很多变种,不过再怎么也不会比下面这个变种版本更帅:请你设计一种方案,在一个无穷大的棋盘的每一行每一列里都放置一个皇后,使得所有皇后互相之间都不攻击。具体地说,假设这个棋盘的左下角在原点处,从下到上有无穷多行,从左到右有无穷多列,你需要找出一个全体正整数的排列方式 a1,a2,a3,… ,使得当你把第一个皇后放在第一行的第 a1 列,把第二个皇后放在第二行的第 a2 列,等等,那么任意两个皇后之间都不会互相攻击。
下面给出一个非常简单巧妙的构造。首先,我们给出五皇后问题的一个解。并且非常重要的是,其中一个皇后占据了最左下角的那个格子。
接下来,我们把五皇后的解扩展到 25 皇后,而依据则是五皇后本身的布局:
样一来,同一组里的五个皇后显然不会互相攻击,不同组的皇后之间显然也不会互相攻击,这便是一个满足要求的 25 皇后解了。注意到,在扩展之后,之前已经填好的部分并未改变。 再接下来怎么办呢?没错,我们又把 25 皇后的解复制成五份,再次按照五皇后的布局来排列,从而扩展到 125 皇后!
像这样不断地根据已填的部分,成倍地向外扩展,便能生成一个无穷皇后问题的解。
以上是大佬教程为你收集整理的JavaScript解八皇后问题的方法总结全部内容,希望文章能够帮你解决JavaScript解八皇后问题的方法总结所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。