普林斯顿算法课第四周作业_8Puzzle
作业地址:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html
作业难点:
1、如何求一个Puzzle的解?
根据作业提示,使用MinPQ将GameTree的不同状态以hamming或manhattan方法求得优先级,加入MinPQ队列,并对min值进行分析,直到达到最后状态。需要自定义MinPQ使用的数据结构。
2、如何在有限步的情况下判断一个Puzzle是否有解?
根据作业提示,如果Twin有解那么原始Puzzle就无解,因此可以将两个Puzzle一起加入优先队列分析;在求到最终状态后,通过回溯初始状态,进而判断Puzzle是否有解。
容易扣分点:
1、manhattan()算法中的列边界;
2、twin()无效,主要是没有理解twin的定义;
3、equals()实现随意,务必留意参考类的equals()实现;
4、不能在有限步情况下求得最终结果,造成内存溢出;
5、moves()结果是原始Puzzle的还是twinPuzzle的。
部分代码参考:
manhattan():
public int manhattan()
{
int mhNum = 0;
int blockNum = 0;
int posX = 0;
int posY = 0;
for (int i = 0; i < brdDim; i++) {
for (int j = 0; j < brdDim; j++) {
blockNum = i * brdDim + j + 1;
if (brdBlocks[i][j] != blockNum && brdBlocks[i][j] != 0) {
posX = brdBlocks[i][j] / brdDim;
posY = brdBlocks[i][j] % brdDim - 1;
if (posY < 0) {
posY += brdDim;
posX -= 1;
}
mhNum += Math.abs(posY - j) + Math.abs(posX - i);
}
}
}
return mhNum;
}
Solver():
public Solver(Board initial)
{
initBoard = initial;
moveCount = 0;
finalNode = null;
if (initBoard.isGoal()) {
finalNode = new SearchNode(initBoard);
finalNode.moves = moveCount;
return;
}
pq = new MinPQ<SearchNode>();
pq.insert(new SearchNode(initBoard));
pq.insert(new SearchNode(initBoard.twin()));
boolean findGoal = true;
while (findGoal) {
SearchNode srNode = pq.delMin();
for (Board nbrBoard: srNode.a.neighbors()) {
if (nbrBoard.isGoal()) {
finalNode = new SearchNode(nbrBoard);
finalNode.prev = srNode;
finalNode.moves = srNode.moves + 1;
moveCount = finalNode.moves;
findGoal = false;
break;
} else {
if (srNode.prev == null || !nbrBoard.equals(srNode.prev.a)) {
SearchNode nextNode = new SearchNode(nbrBoard);
nextNode.prev = srNode;
nextNode.moves = srNode.moves + 1;
pq.insert(nextNode);
}
}
}
}
}
solution():
public Iterable<Board> solution()
{
Stack<Board> neighbours = new Stack<Board>();
if (finalNode == null) {
StdOut.println("No solution possible");
return null;
}
SearchNode curNode = finalNode;
SearchNode preNode = curNode;
do {
neighbours.push(curNode.a);
preNode = curNode;
curNode = curNode.prev;
} while (curNode != null);
if (!preNode.a.equals(initBoard)) return null;
return neighbours;
}
private static class SearchNode implements Comparable<SearchNode> {
private final Board a; // Board involved in event, possibly null
private SearchNode prev;
private int moves;
public SearchNode(Board a) {
this.a = a;
prev = null;
moves = 0;
}
public int compareTo(SearchNode that) {
return Integer.compare(this.a.manhattan() + moves,
that.a.manhattan() + that.moves);
}
}
普林斯顿算法课第四周作业_8Puzzle的更多相关文章
- coursera普林斯顿算法课part1里Programming Assignment 2最后的extra challenge
先附上challenge要求: 博主最近在刷coursera普林斯顿大学算法课part1部分的作业,Programming Assignment2最后的这个extra challenge当初想了一段时 ...
- 普林斯顿算法课第五周作业_KdTree
作业地址:http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html 作业难点: 1.如何构建KdTree,使用什么样的数据结构? 根 ...
- 2003031121-浦娟-python数据分析第四周作业-第二次作业
项目 内容 课程班级博客链接 20级数据班(本) 作业链接 Python第四周作业第二次作业 博客名称 2003031121-浦娟-python数据分析第四周作业-matolotlib的应用 要求 每 ...
- 20169212《Linux内核原理与分析》第四周作业
Linux第四周作业 1. 堆栈知识 首先回顾了下堆栈相关的知识,堆栈机制是高级语言可以运行的一个基础,这一块需要重点掌握.函数发生调用时,如图 call指令:将eip的按顺序执行的下一条指令(因为在 ...
- 2019年春季学期第四周作业Compile Summarize
这个作业属于哪个课程 C语言程序设计一 这个作业要求在哪里 2019春季学期第四周作业 我的课程目标 重新学习有关数组的问题 这个作业在哪个具体方面帮助我实现目标 对于置换有了新的见解 参考文献 中国 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第四周作业
2018-2019-1 20189221<Linux内核原理与分析>第四周作业 教材学习:<庖丁解牛Linux内核分析> 第 3 章 MenuOS的构造 计算机三大法宝:存储程 ...
- 20169211《Linux内核原理与分析》第四周作业
20169211<Linux内核原理与分析>第四周作业内容列表 1.教材第3.5章节知识学习总结: 2.实验楼配套实验二实验报告: 1.<linux内核设计与实现>教材第3.5 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周作业 一.上周问题总结: 虚拟机环境缺少部分库文件 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境使用gdb跟踪调试内核 1.1 在该环境下输入 ...
- 2019-2020-1 20199328《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周作业 步骤一 首先我们指定一个内核并指定内存根文件系统,这里的bzImage是vmLinux经过gzip压缩的内核,"b"表示&quo ...
随机推荐
- Code Snippets 代码片段
Code Snippets 代码片段 1.Title : 代码片段的标题 2.Summary : 代码片段的描述文字 3.Platform : 可以使用代码片段的平台,有IOS/OS X/ ...
- 导出excel报错
System.ComponentModel.Win32Exception: 拒绝访问 1.问题现象: foreach (System.Diagnostics.Process thispro in Sy ...
- 基于.net搭建热插拔式web框架(实现原理)
第一节:我们为什么需要一个热插拔式的web框架? 模块之间独立开发 假设我们要做一个后台管理系统,其中包括“用户活跃度”.“产品管理”."账单管理"等模块.每个模块中有自己的业务特 ...
- JavaScript 日期选择器 Pikaday
找一些插件的过程实在太痛苦了...好容易找到一个,赶紧记录下.免得以后重复浪费时间在这上面. 插件名:Pikaday github地址:https://github.com/dbushell/Pika ...
- 收集免费可用稳定的vpn
收集免费可用稳定的vpn,经常用到,所以记录一下,方便自己不备之需. 1,https://www.lvbeivpn.cc/share.shtml?id=a3bd9527225d4746bb3a5761 ...
- Docker知识-1
[编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...
- Mac 使用Sublime Text 3 搭建C开发环境
Sublime Text 3 (安装包,注册码 ,汉化包) 1)工具-编译系统-新建编译器 { "cmd" : ["gcc -o ${file_base_name} $ ...
- 419. Battleships in a Board
https://leetcode.com/problems/battleships-in-a-board/ 给定一个N×N的棋盘,有任意数量的1×N或N×1大小的"船",注意船船之 ...
- 2015 史考特(Scottrade)开户指南 + 招商银行香港一卡通汇款【图文教程】
最近刚开始炒美股.总的来说分为两步:一是开户,即选一个美股券商开设股票交易账户:二是汇款注资,把人民币换成美元转账到股票交易账户上.上述第一点其实相对简单,美股券商大多都对美国以外的外国人开放申请,且 ...
- set和map的简单用法
.set(集合)map(映射)都属于关联类容器 都支持查询一个元素是否存在并能够有效地获取元素. set集合的元素总是从小到大排列,set集合通过二分查找树实现.它具备以下两个特点: ①:独一无二的元 ...