普林斯顿算法课第四周作业_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 ...
随机推荐
- python smtp 群发邮件
最近工作中遇到使用脚本处理问题并发送结果邮件,使用python的smtp模块很简单的完成了实现.今天遇到一个问题,根据脚本的测试结果需要群发邮件,但是发送邮件的py文件只有首个地址收到了邮件.仔细排查 ...
- JSON数据的使用
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...
- pg gem 安装(postgresql94)
使用下面命令安装报错 gem install pg 错误: [root@AS-test middle_database]# gem install pgBuilding native extensio ...
- 整理一下Entity Framework的查询 [转]
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...
- 【krpano】加密XML手动解密分析
krpano允许对XML文件进行加密,对XML进行相应的保护.加密分为两种,第一种为公共加密,即允许其他krpano全景读取该XML,而另一种为私有加密,仅允许加密的用户读取XML.两种加密方式的算法 ...
- 利用chrome插件批量读取浏览器页面内容并写入数据库
试想一下,如果每天要收集100页网页数据甚至更多.如果采用人工收集会吐血,用程序去收集也就成为一个不二的选择.首先肯定会想到说用java.php.C#等高级语言,但这偏偏又有个登陆和验证码,搞到无所适 ...
- win7系统下的飞秋发送文件失败问题
飞秋发送文件失败这个问题大多数是由防火墙引起的1.检查windows自带的防火墙设置,在左侧的"允许程序通过windows防火墙"查看飞秋是否存在,不存在则增加之,公网.专网都勾选 ...
- DevExpress 在使用Ribbon皮肤时标题栏不变化的原因
将 form的 AllowFormGlass 属性 该为False 就可以标题栏皮肤化了.
- C#版BitStream 1.0
根据C++版的改编,刚刚改完,估计使用会有问题,对于uint8处理的不好 关于使用: BitStream bs = new BitStream( ); bs.WriteInt32( ); int a ...
- 在MonthCalendar控件中选中日期
Calendar.MONTH Calendar now=Calendar.getInstance();System.out.print(now.get(Calendar.MONTH));得到的月份少1 ...