递归 算法思路和优化和简单实现: 黑白子交换
原文链接: 递归 算法思路和优化和简单实现: 黑白子交换
上一篇: fabric 绘制心形线
下一篇: 解决steam生化奇兵无限启动报错: steam 服务器 过于繁忙... [已解决]
题目和原解法
https://mp.weixin.qq.com/s/eaapP58V31pwgd22hHUgEw
原文用py和循环15步完成, 其实这个比较简单, 没啥可玩的, 重点在于思路
状态由三个, 不能使用位运算, 但是可以使用十进制的每个位
首先用数组表示实属有点浪费, 哪怕是字符串呢, 不过数组确实操作方便, 这个题目的搜索难度也不大所以用啥都行, 最好是封装位运算或者字符串, 这样判断是否阻塞也方便
对于每一次搜索, 所有可以进行的操作就是一步, 然后深搜即可, 每进一步执行操作更新状态, 每撤销一步恢复状态, 由于状态就是数字, 不会有引用问题
由于每次操作数目有限, 目测应该是指数级
本来不想写的... 不过实在没啥事干就用js实现下吧...
深搜简单实现下, 每加阻塞判断和优化, 跑出来的结果也是15, 一共只有两个解... 原文中给的是第二个解
[[2223133, 2213233, 2123233,2321233, 2323213, 2323231,2323132, 2313232, 1323232,3123232, 3321232, 3323212,3323122, 3313222, 3331222],[2212333, 2232133, 2232313,2231323, 2132323, 1232323,3212323, 3232123, 3232321,3232312, 3231322, 3132322,3312322, 3332122, 3331222]
]
const white = 2
const blank = 1
const black = 3
const moveType = {left: 0, // 左移leftJump: 1, // 左跳right: 2, // 右移rightJump: 3, // 右跳
}
// 由低位到高位 1:空格,2:白,3:黑
const show = n => {console.log(toList(n).reverse().join("-"),)
}
const toList = n =>Array(7).fill(0).map((_, i) => ((n / 10 ** i) | 0) % 10)
/*
2 2 2 1 3 3 3
index 0 1 2 3 4 5 6
value 3 3 3 1 2 2 2
*/
initState = 2221333
show(initState) // 2-2-2-1-3-3-3// 是否满足终止条件
const check = n => {return n === 3331222
}
const showStop = n => {return false
}
const get = (n, index) => ((n / 10 ** index) | 0) % 10
const set = (n, index, value) =>n - get(n, index) * 10 ** index + value * 10 ** index
const exchange = (n, from, to) => {const fv = get(n, from)const tv = get(n, to)return set(set(n, from, tv), to, fv)
}const doMove = (n, { type, index }) => {if (type === moveType.left) {return exchange(n, index, index + 1)} else if (type === moveType.leftJump) {return exchange(n, index, index + 2)} else if (type === moveType.right) {return exchange(n, index, index - 1)} else if (type === moveType.rightJump) {return exchange(n, index, index - 2)}
}
const indexArray = Array(7).fill(0).map((_, k) => k)
// 获取可操作的集合
const getOpList = n => {// 空格所在位置const blankIndex = indexArray.find(i => get(n, i) === blank)console.log("blankIndex", blankIndex)const list = []for (let i = 0; i < 7; i++) {if (i === blankIndex) continueif (get(n, i) === black) {if (i + 1 < 7 && i + 1 === blankIndex) {// 黑左移list.push({type: moveType.left,index: i,})} else if (i + 2 < 7 && get(n, i + 1) === white && i + 2 === blankIndex) {// 黑左跳list.push({type: moveType.leftJump,index: i,})}} else {if (i >= 1 && i - 1 === blankIndex) {// 白右移list.push({type: moveType.right,index: i,})} else if (i >= 2 && get(n, i - 1) === black && i - 2 === blankIndex) {// 白右跳list.push({type: moveType.rightJump,index: i,})}}}return list
}
// 是否存在阻塞
const shouldStop = () => {}
const answer = []
const dfs = (n, path = []) => {console.log("dfs", n, path.length)if (check(n)) {console.log(path.length, path)answer.push([...path])return true}if (shouldStop(n)) {// 存在阻塞return false}const list = getOpList(n)// 获取所有可以执行的操作for (const op of list) {// 进行操作console.log(op)path.push(doMove(n, op))const res = dfs(doMove(n, op), path)path.pop()if (res) {// return true}}return false
}dfs(initState)
console.log(answer)
递归 算法思路和优化和简单实现: 黑白子交换相关推荐
- 黑白子交换c语言思路,递归 算法思路和优化和简单实现: 黑白子交换
题目和原解法 原文用py和循环15步完成, 其实这个比较简单, 没啥可玩的, 重点在于思路 状态由三个, 不能使用位运算, 但是可以使用十进制的每个位 首先用数组表示实属有点浪费, 哪怕是字符串呢, ...
- 0.96寸OLED用两点式画直线算法思路分享—代码开源—简单易懂超详细
这个算法是纯原创,没有任何借鉴的元素 实现原理大概就是通过两个点算出直线方程然后描点 在这个函数中OLED_DrawDot函数是描点函数,如果和自己代码里不匹配可以换成自己代码里的描点函数. 先看整个 ...
- C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
- [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
- 做diff_Vue3.0时代你必须了解的:diff算法原理和优化
关注前端公众号 [前端每日一博] 前言 面试官: 你知道 Vue3.0 Object.difineProperty和vue3.0的proxy的区别吗? 你知道 Vue3.0 diff算法原理和它有什么 ...
- 家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化
目录 什么是数据库查询优化? 影响查询优化的因素 优化策略概述 查询优化的总体思路 语义优化 -- 内容等价性 语法优化(逻辑层优化)---语法等价性 执行优化(物理层优化) 查询优化在DBMS中的位 ...
- 生物效应大数据评估聚类算法的并行优化
生物效应大数据评估聚类算法的并行优化 彭绍亮1,2,杨顺云2,孙哲1,程敏霞1,崔英博2,王晓伟2,李非3,伯晓晨3,廖湘科2 1. 湖南大学信息科学与工程学院&国家超级计算长沙中心,湖南 长 ...
- c语言数字排列和算法思路,冒泡排序、快速排序算法理解及C程序实现
前言:关于 快速排序算法的相关理解,本文借鉴了 啊哈磊 老师的<常用排序--快速排序> ,在此向作者 致敬,写的挺好. 目录 一.冒泡排序 二.快速排序 三.小结 一.冒泡排序 冒泡排序是 ...
- 最小生成树 Kruskal 和 Prim算法及堆优化
目录 生成树/最小生成树是什么. 一.Kruskal算法 Kruskal模板 二.Prim算法及堆优化 1.遍历 Prim 普通模板 2.堆优化 Prim 堆优化模板 解决最小生成树的问题之前,我们先 ...
最新文章
- 智源研究院发布“知识疫图-全球新冠疫情智能驾驶舱”,一键预测、跟踪和决策辅助...
- 连续时间傅里叶变换(FT)
- 《梦断代码Dreaming In Code》阅读计划
- 不想当管理者、甚至连项目经理都也不想当,只想静心写写代码、不做管理
- java面试题大合集(开发者必看三)
- CentOS7中通过二进制文件与配置环境变量的方式安装Node
- 26/100. Min Stack
- python布尔类型运算_9.python的布尔类型与流程控制
- .NET框架类库中的命名空间
- java之ThreadLocal简单使用总结
- html动画用css还是js,javascript与css3动画结合使用小结
- 前端学习(1770):前端调试之如何参照站点的manifest
- android 结束if循环_(第五讲)if 分支语句和 while 循环
- 网管,请别随意关闭默认共享
- 虚拟机克隆后没有IP
- yolov4训练自己的数据
- Atitit nlp 自然语言处理attilax总结 目录 1.1. 主要范畴	1 1.2. 研究难点	2 2. Ati涉及的领域(文档 tts 分词 抽取 摘要 检索)	2 3. Atit
- 图解对比MySQL索引为什么要用B+树
- MySql union 连接使用
- ADB命令连接逍遥模拟器并查看安卓日志