作业地址: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. Ajax详解

    一:什么是Ajax AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ...

  2. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  3. Yii2 assets注册的css样式文件没有加载

    准备引入layui.css文件的,在LayuiAssets类中已经配置了资源属性 <?php namespace frontend\assets; use yii\web\AssetBundle ...

  4. python爬虫小项目实战

  5. less入门

    less入门 安装 首先安装node,执行命令 node install -g less安装完成后可以在任意窗口中使用lessc命令,将.less文件编译成css文件. 变量 可以像其他语言一样声明变 ...

  6. Android Studio 导出jar包

    不像在Eclipse,可以直接导出jar包.AndroidStudio只可以生成aar包. 在网上看到许多朋友问怎么可以像Eclipse一样导出jar包,其实我们只要知道它的原理就可以了. 用jar命 ...

  7. java模拟post方式提交表单实现图片上传【转】

     转自:http://blog.csdn.net/5iasp/article/details/8669644 模拟表单html如下:   <form action="up_result ...

  8. yii2 登录用户和未登录用户使用不同的 layout

    可以在配置文件中增加一个 “beforeRequest” 事件: 'on beforeRequest' => function () { Yii::$app->layout = Yii:: ...

  9. composer 使用笔记

    使用composer 更新项目比如: composer create-project topthink/think wwwroot dev-master --prefer-dist提示openssl异 ...

  10. saltstack命令执行过程

    saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...