题目&解题思路:


代码:

import java.io.PushbackInputStream;
import java.util.*;public class Puzzle_9 {public static final int  N = 3;public static final int N2 = 9;public static final int dx[] = {-1, 0, 1, 0};public static final int dy[] = {0, -1, 0, 1};public static final char dir[] = {'u', 'l', 'd', 'r'};public static class Puzzle implements Comparable {int f[] = new int[N2];int space;String path;@Overridepublic int compareTo(Object obj){Puzzle p = (Puzzle)obj;int cnt = 0;for (int i=0;i<N2;i++){if(p.f[i]==this.f[i])cnt++;else{return -1;}}if (cnt==9){return 0;}else{return -1;}}}//如果第i个元素对应的不是(i+1),那么就返回falsepublic static boolean isTarget(Puzzle p){for (int i=0;i<N2;i++){if(p.f[i]!=(i+1)){return false;}}return true;}public static String bfs(Puzzle s){ArrayDeque<Puzzle> Q = new ArrayDeque<>();HashSet<Puzzle> V = new HashSet<>();Puzzle u = new Puzzle();Puzzle v = new Puzzle();s.path = "";//将传入的路径设置为空Q.addLast(s);//入队V.add(s);//将s的状态添加进入历史访问集合while (!Q.isEmpty()){u = copyPuzzle(Q.peek());Q.removeFirst();if(isTarget(u))return u.path;//如果完成目标了,则返回u的路径int sx = u.space/N;//用于对当前空格的定位int sy = u.space%N;for (int r=0;r<4;r++){int tx = sx + dx[r];//设置4个方位的移动int ty = sy + dy[r];if(tx<0||ty<0||tx>=N||ty>=N)continue;v = copyPuzzle(u);//移动空格int temp = v.f[u.space];v.f[u.space] = v.f[tx*N+ty];v.f[tx*N+ty] = temp;//设置空格位置v.space = tx*N+ty;//判断这个状态历史上是否发生,如果发生就跳过,没发生就执行:if(!isContain(V,v)){V.add(v);//将当前状态加入历史记录集合v.path += dir[r];//将移动操作添加到其路径中Q.addLast(v);//将当前状态入队等待操作}}}return "unsolvable";}public static boolean isContain(HashSet<Puzzle> V, Puzzle v){Iterator<Puzzle> it = V.iterator();while(it.hasNext()){Puzzle element = it.next();if(element.compareTo(v)==0){return true;};}return false;}public static Puzzle copyPuzzle(Puzzle p){Puzzle p1 = new Puzzle();p1.space = p.space;p1.path = p.path;for (int i=0;i<N2;i++){p1.f[i] = p.f[i];}return p1;}public static void main(String[] args) {Scanner cin = new Scanner(System.in);Puzzle in = new Puzzle();for (int i=0;i<N2;i++){in.f[i] = cin.nextInt();if(in.f[i] == 0){in.f[i] = N2;in.space = i;}}String ans = bfs(in);System.out.println(ans.length());}
}

输入:

1 3 0
4 2 5
7 8 6

输出:

4

这次的代码有很多值得玩味的地方,虽然耽误了很多时间,踩了很多坑,也总结很多经验。

1.目的:想要用对象2存入对象1中的所有值。
错误做法:将对象2赋值给对象1。
结果:更改对象2时,对象1也会同时更改。
原因:将对象2赋值给对象1的动作实际上是把对象2的地址赋给对象1,因此无论操作对象1还是对象2都是操作的同一片内存空间。
解决方案:为对象1开辟一份新的内存空间,将对象2中所有的值赋给对象1,甚至是对象1中的数组也要以元素为单位一一赋值

示例代码:

public static Puzzle copyPuzzle(Puzzle p){Puzzle p1 = new Puzzle();p1.space = p.space;p1.path = p.path;for (int i=0;i<N2;i++){p1.f[i] = p.f[i];}return p1;}

2.目的:如何自定义比较两个对象是否一致。
错误做法:再写一个函数比较,很麻烦。
解决方案:实现Comparable接口,并重写compareTo方法,这样就可以定义一个比较器,从而比较别的对象是不是和自己相同

示例代码:

    public static class Puzzle implements Comparable {int f[] = new int[N2];int space;String path;@Overridepublic int compareTo(Object obj){Puzzle p = (Puzzle)obj;int cnt = 0;for (int i=0;i<N2;i++){if(p.f[i]==this.f[i])cnt++;else{return -1;}}if (cnt==9){return 0;}else{return -1;}}}

3.对于一个ArrayDeque队列,添加删除元素时,最好用addLast,removeFirst这样的函数,否则使用push、add、remove、pop就不确定从哪头插入元素删除元素了,这就失去了队列的意义,也是今天卡了很久的原因

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现相关推荐

  1. 【操作指导 | 代码实现】挑战程序设计竞赛2:算法和数据结构

    书籍封面 第一章 前言 1. 本人衷心建议 ~~~~~~       如果你是一位初学者,我指的是你只会基本的 C/C++ 编程,即使编的很烂,这本书对于你算法和数据结构的提升非常有帮助,所涉及的每一 ...

  2. 《挑战程序设计竞赛》推荐及算法相关书籍吐槽

    前几天,秋叶拓哉(iwi).岩田阳一(wata)和北川宜稔(kita_masa)所著,我(watashi).庄俊元(navi)和李津羽(itsuhane)翻译的<挑战程序设计竞赛>,终于通 ...

  3. koch算法c语言递归,【挑战程序设计竞赛】 递归与分治算法

    [挑战程序设计竞赛] 递归与分治算法 [挑战程序设计竞赛] 递归与分治算法 递归与分治算法穷举搜索题目 思路 代码 科赫曲线题目 思路 代码 将问题分解,通过求解局部性的小问题来解决原本的问题,这种技 ...

  4. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  5. 挑战程序设计竞赛(第2版)》

    <挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...

  6. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)

    白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...

  7. 《挑战程序设计竞赛》 读后感(转载)

    <挑战程序设计竞赛> 读后感 最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了<挑战程序设计竞赛>这本书.花了一周的时间大体过了一遍,该书真切地让我理解了" ...

  8. 挑战程序设计竞赛(第二章习题总结)

    文章目录 搜索 Curling 2.0(POJ 3009) Meteor Shower(POJ 3669) Smallest Difference(POJ 2718) Hopscotch(POJ 30 ...

  9. 《挑战程序设计竞赛》--初级篇习题POJ部分【2.4 - 2.6】

    这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是2.4 ~ 2.6部分: 导航 2.4 加工并存储的数据结构 优先队列 Sunscreen MooUnivers ...

最新文章

  1. 黑马程序员5 多线程
  2. 2021年春季学期-信号与系统-第六次作业参考答案-第十小题
  3. Android Studio通过JNI调用NDK程序
  4. GridView实践
  5. 系统镜像服务器,服务器系统镜像
  6. mysql for windows 64_MySQL 5.6 for Windows 解压缩版配置安装(win 10 64位亲测)附安装包下载链接...
  7. h5页面预览pdf文件_H5怎么实现在线预览PDF
  8. android动画送礼物,【Android】直播App礼物弹窗及连送礼物动画
  9. ouravr某PCB高手发言总结
  10. 74cms搭建 2021.03.13
  11. word打开出错,要进入安全模式问题
  12. JavaScript - 正则(RegExp)判断文本框中是否包含特殊符号
  13. 彼泽清陂nbsp;菡萏悠悠
  14. chrome无法打开无痕模式的解决方案
  15. Caffeine - Caches - Removal
  16. 如何做好百度竞价?需清楚竞价账户的结构和核心思维
  17. 匹兹堡计算机科学公司,匹兹堡大学计算机科学专业排名第49(2020年USNEWS美国排名)...
  18. vue访问public路径
  19. DB2快速入门—DB2 11的安装与使用
  20. 原始设备制造商OEM简介

热门文章

  1. 比尔·盖茨:现在比任何时候都需要新的救命工具,向CEPI再捐1.5亿美元加速疫苗研发...
  2. 视频点播服务器的配置如何选择,需要多大的带宽
  3. uniapp 显示消息提示框 操作
  4. PointNetGPD 代码复现,环境配置,结果展示
  5. Python实现飞机大战(搞怪)游戏!这是你没见过的全新版本!
  6. XML知识3--Schema
  7. linux 拼图游戏,立体艺术拼图游戏
  8. 关于yml文件图标为粉红色转成绿色的问题
  9. 腾讯宣布五年5000亿投入计划,发力新基建
  10. CDH大数据平台 ERROR Heartbeating to 192.168.0.200:7182 failed