作业地址: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的更多相关文章

  1. coursera普林斯顿算法课part1里Programming Assignment 2最后的extra challenge

    先附上challenge要求: 博主最近在刷coursera普林斯顿大学算法课part1部分的作业,Programming Assignment2最后的这个extra challenge当初想了一段时 ...

  2. 普林斯顿算法课第五周作业_KdTree

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html 作业难点: 1.如何构建KdTree,使用什么样的数据结构? 根 ...

  3. 2003031121-浦娟-python数据分析第四周作业-第二次作业

    项目 内容 课程班级博客链接 20级数据班(本) 作业链接 Python第四周作业第二次作业 博客名称 2003031121-浦娟-python数据分析第四周作业-matolotlib的应用 要求 每 ...

  4. 20169212《Linux内核原理与分析》第四周作业

    Linux第四周作业 1. 堆栈知识 首先回顾了下堆栈相关的知识,堆栈机制是高级语言可以运行的一个基础,这一块需要重点掌握.函数发生调用时,如图 call指令:将eip的按顺序执行的下一条指令(因为在 ...

  5. 2019年春季学期第四周作业Compile Summarize

    这个作业属于哪个课程 C语言程序设计一 这个作业要求在哪里 2019春季学期第四周作业 我的课程目标 重新学习有关数组的问题 这个作业在哪个具体方面帮助我实现目标 对于置换有了新的见解 参考文献 中国 ...

  6. 2018-2019-1 20189221《Linux内核原理与分析》第四周作业

    2018-2019-1 20189221<Linux内核原理与分析>第四周作业 教材学习:<庖丁解牛Linux内核分析> 第 3 章 MenuOS的构造 计算机三大法宝:存储程 ...

  7. 20169211《Linux内核原理与分析》第四周作业

    20169211<Linux内核原理与分析>第四周作业内容列表 1.教材第3.5章节知识学习总结: 2.实验楼配套实验二实验报告: 1.<linux内核设计与实现>教材第3.5 ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第四周作业

    <Linux内核原理与分析>第四周作业 一.上周问题总结: 虚拟机环境缺少部分库文件 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境使用gdb跟踪调试内核 1.1 在该环境下输入 ...

  9. 2019-2020-1 20199328《Linux内核原理与分析》第四周作业

    <Linux内核原理与分析>第四周作业 步骤一 首先我们指定一个内核并指定内存根文件系统,这里的bzImage是vmLinux经过gzip压缩的内核,"b"表示&quo ...

随机推荐

  1. easyui Datagrid查询报错Uncaught TypeError:Cannot read property 'length' of undefined

    1.问题描述 easyui中datagrid执行loadData方法出现如下异常:Cannot read property 'length' of undefined 2.一开始怀疑是js或者页面的问 ...

  2. Android压缩图片到100K以下并保持不失真的高效方法

    前言:目前一般手机的相机都能达到800万像素,像我的Galaxy Nexus才500万像素,拍摄的照片也有1.5M左右.这么大的照片上传到服务器,不仅浪费流量,同时还浪费时间. 在开发Android企 ...

  3. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

    http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 配置环境 了解HTTPS 配置CA证书服务器 新建示例网站并发布在IIS ...

  4. 把两个table放在一个Repeater中显示

    DataTable dt; DataTable dt1; HLoanApplyInfo applyInfo = HLoanApplyBll.GetModelById(FLoanID); FLoanID ...

  5. DataTable常用代码

    构建DataTable DataTable dtUserInfo = new DataTable("UserInfo"); dtUserInfo.Columns.Add(" ...

  6. Android导包导致java.lang.NoClassDefFoundError

    摘要: SDK方法总数是不能超过65k的.是否也引入其他的三方库,导致总数超过限制.超出限制会导致部分class找不到,引发java.lang.NoClassDefFoundError.解决方法:近日 ...

  7. Windows 网络编程

    网络编程 API ,失败返回 -,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPRO ...

  8. nginx负载均衡集群

    nginx负载均衡集群  0.前言:nginx 负载均衡,属于网络7层模型中的应用层,说白了就是一个代理,要用 upstrem 模块实现,代理则用proxy模块 1.可以针对域名做转发,lvs只能针对 ...

  9. 调用图片按钮的img图片

    今天是我学前端的第12天.早上起床后活动筋骨时看了<JS的基本属性操作>,作业是模拟手机发送短信.文字都能传输到<div>上,就是图片不知道怎么传.折腾了好久才弄清楚,多亏了某 ...

  10. 获取QQ缓存图片