作业地址: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. linux防火墙开启端口

    1.使用命令查看端口开启情况(下图为安装时未选择开启防火墙) [root@fullstack ~]# iptables -L -n Chain INPUT (policy ACCEPT) target ...

  2. 07-本地 YUM 源制作

    1.YUM相关概念 1.1.什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基 ...

  3. Maven POM元素继承

    为了减少重复代码的编写,我们需要创建POM的父子结构,然后在POM中申明一些配置供子POM继承,以实现"一处申明,多处使用的"目的.以之前的模块中的结构为基础,在account-a ...

  4. java基础 布局管理器

    概念: 组建在容器(比如JFrame)中的位置和 大小 是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组建的布局管理. 种类: java共提供了物种布局管理器:流式布局管理 ...

  5. CI加载model的问题

    1.需求 CI在linux上无法加载model 2.原因 因为linux区分大小写,且model文件名首字符要大写. As said in the comments : Your model's fi ...

  6. 理解Angular中的$apply()以及$digest()

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...

  7. PHP 图片上传工具类(支持多文件上传)

    ====================ImageUploadTool======================== <?php class ImageUploadTool { private ...

  8. TJpgDec—轻量级JPEG解码器

    TJpgDec-轻量级JPEG解码器 本文由乌合之众lym瞎编,欢迎转载blog.cnblogs.net/oloroso 下文中解码一词皆由decompression/decompress翻译而来. ...

  9. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  10. 《PHP中的Math函数》笔记

    ① abs() 绝对值; ② ceil() 向上取整; ③ floor() 向下取整; ④ fmod() 返回除法的浮点数余数; ⑤ getrandmax() 显示随机数最大的可能值; ⑥ is_fi ...