原文链接: 递归 算法思路和优化和简单实现: 黑白子交换

上一篇: 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)

递归 算法思路和优化和简单实现: 黑白子交换相关推荐

  1. 黑白子交换c语言思路,递归 算法思路和优化和简单实现: 黑白子交换

    题目和原解法 原文用py和循环15步完成, 其实这个比较简单, 没啥可玩的, 重点在于思路 状态由三个, 不能使用位运算, 但是可以使用十进制的每个位 首先用数组表示实属有点浪费, 哪怕是字符串呢, ...

  2. 0.96寸OLED用两点式画直线算法思路分享—代码开源—简单易懂超详细

    这个算法是纯原创,没有任何借鉴的元素 实现原理大概就是通过两个点算出直线方程然后描点 在这个函数中OLED_DrawDot函数是描点函数,如果和自己代码里不匹配可以换成自己代码里的描点函数. 先看整个 ...

  3. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  4. [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  5. 做diff_Vue3.0时代你必须了解的:diff算法原理和优化

    关注前端公众号 [前端每日一博] 前言 面试官: 你知道 Vue3.0 Object.difineProperty和vue3.0的proxy的区别吗? 你知道 Vue3.0 diff算法原理和它有什么 ...

  6. 家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化

    目录 什么是数据库查询优化? 影响查询优化的因素 优化策略概述 查询优化的总体思路 语义优化 -- 内容等价性 语法优化(逻辑层优化)---语法等价性 执行优化(物理层优化) 查询优化在DBMS中的位 ...

  7. 生物效应大数据评估聚类算法的并行优化

    生物效应大数据评估聚类算法的并行优化 彭绍亮1,2,杨顺云2,孙哲1,程敏霞1,崔英博2,王晓伟2,李非3,伯晓晨3,廖湘科2 1. 湖南大学信息科学与工程学院&国家超级计算长沙中心,湖南 长 ...

  8. c语言数字排列和算法思路,冒泡排序、快速排序算法理解及C程序实现

    前言:关于 快速排序算法的相关理解,本文借鉴了 啊哈磊 老师的<常用排序--快速排序> ,在此向作者 致敬,写的挺好. 目录 一.冒泡排序 二.快速排序 三.小结 一.冒泡排序 冒泡排序是 ...

  9. 最小生成树 Kruskal 和 Prim算法及堆优化

    目录 生成树/最小生成树是什么. 一.Kruskal算法 Kruskal模板 二.Prim算法及堆优化 1.遍历 Prim 普通模板 2.堆优化 Prim 堆优化模板 解决最小生成树的问题之前,我们先 ...

最新文章

  1. 智源研究院发布“知识疫图-全球新冠疫情智能驾驶舱”,一键预测、跟踪和决策辅助...
  2. 连续时间傅里叶变换(FT)
  3. 《梦断代码Dreaming In Code》阅读计划
  4. 不想当管理者、甚至连项目经理都也不想当,只想静心写写代码、不做管理
  5. java面试题大合集(开发者必看三)
  6. CentOS7中通过二进制文件与配置环境变量的方式安装Node
  7. 26/100. Min Stack
  8. python布尔类型运算_9.python的布尔类型与流程控制
  9. .NET框架类库中的命名空间
  10. java之ThreadLocal简单使用总结
  11. html动画用css还是js,javascript与css3动画结合使用小结
  12. 前端学习(1770):前端调试之如何参照站点的manifest
  13. android 结束if循环_(第五讲)if 分支语句和 while 循环
  14. 网管,请别随意关闭默认共享
  15. 虚拟机克隆后没有IP
  16. yolov4训练自己的数据
  17. Atitit nlp 自然语言处理attilax总结 目录 1.1. 主要范畴 1 1.2. 研究难点 2 2. Ati涉及的领域(文档 tts 分词 抽取 摘要 检索) 2 3. Atit
  18. 图解对比MySQL索引为什么要用B+树
  19. MySql union 连接使用
  20. ADB命令连接逍遥模拟器并查看安卓日志

热门文章

  1. [elk]elastalert邮箱告警
  2. 网络经济与企业管理总结
  3. 世上无奸商,只有笨顾客
  4. 应用软件提示服务器正在运行,Win10开机提示服务器正在运行中怎么办?
  5. 028 二次型标准化 方法一配方法
  6. textarea 自适应宽度和高度
  7. matlab导出html,怎么将MATLAB代码导出到Word
  8. java @Override is not allowed when implementing interface method
  9. 什么样的网站策划最到位?
  10. Java实现ATM机系统