js实现八皇后的注释详解
来源:互联网 发布:linux注销当前用户 编辑:程序博客网 时间:2024/05/02 01:03
八皇后问题国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路:试错,类似迷宫
简述:
1.第1行找到第一个合适的位置后直接进入第2行
2.第2行找到的位置跟已经放上去的元素做计算,判断是否复合要求(不能攻击),遍历直到找到第一个满足的元 素,直接 进入第三行
3.第3行如果所有的元素都不合适,则返回第二行,顺着原来的位置向后找,如果找到合适的元素,再次进入第三 行,如果 第2行没有合适的,则跳回第一行,第一行从上一个合适的元素向后寻找。。。。。。
如何判定不能攻击:
1.同一列
2.两个皇后横坐标做差,纵坐标做差,两个差的比值为1或者-1;
事实上根据这些描述和接下来的代码,要看明白解题过程,依然会有一些困难,即便看明白了,理解不够深,过一段时间依然会忘记,最好的方式就是亲眼看到程序实现的过程,然后逆推程序的流程,真正搞明白解题思路,想要做到这一点,需要借助debugger工具, 代码后面会介绍如何借助debugger观察程序执行过程以及皇后位置的变动,特别是回退,前进的跳转;
代码如下:
//借助debugger能够非常清晰地看到跳转的过程!var n = 8;
var arr = [];
function queen( index ) {
if( index === n ) {
console.log( arr );//每次完成一种情况,输出数组;
}else{
for( var i = 0; i < n; ++i ) {
arr[ index ] = i;//为第一行的皇后寻找位置,从0开始,直到7
var flag = true;//这里主要是为判定可攻击性提供一个开关,如果在攻击范围内
// 则不进入下一列,继续向下寻找,如果找到了合适的位置,则进入下一行
for( var j = 0; j < index; ++j ) {
//这里是为了判定攻击范围,把所有已经放置的皇后与当前放置的皇后做位置计算,如果在攻击范围内,flag为false,不在所有已经放置的皇后的攻击范围内,则不改变flag的属性:true
if( arr[ index ] === arr[ j ] || arr[ index ] - arr[ j ] === index - j || arr[ index ] - arr[ j ] === j - index ) {
flag = false;
break;
};
};
if( flag ) {
//这里是根据flag的属性判定是否进入下一行的循环;
queen( index + 1 );
}
}
}
};
queen( 0 );//从第0行进行试探
观察变量: index, arr, flag
逐步执行可以非常清楚地看到程序执行的流程,然后再结合注释理解代码,理解会更加深入!
0 0
- js实现八皇后的注释详解
- 八皇后问题的实现
- 八皇后的python实现
- 八皇后问题的实现
- 八皇后 c语言递归实现方法(带注释)
- 八/N皇后问题的详解
- 八皇后详解
- 八皇后详解
- 八皇后详解
- 八皇后问题的java实现
- “八皇后”动态图形的TC实现
- 八皇后动态图形的实现
- 八皇后问题动态图形的实现
- 八皇后问题的java 实现
- 八皇后问题的java实现
- 八皇后的C语言实现
- 八皇后问题的c++实现
- 八皇后问题的算法实现
- 每日乱谈(一)
- ThinkPhp框架学习之入门第一天
- [webAPP项目]基于MUI框架webAPP开发功能流程之引导图制作详解01
- github入门小结
- HDU 2647 Reward(拓扑排序)
- js实现八皇后的注释详解
- Python文章推荐1
- Android 6.0源码结构
- Could not get unknown property 'ANDROID_BUILD_SDK_VERSION'
- 1044. 火星数字(20)
- SpringMVC annotation验证
- 打造高性能高可靠性可配置的通用EDI
- 变量和常量
- 第二章:java内存区域与内存溢出异常