当前位置:   article > 正文

八数码问题dfs

八数码问题dfs

 

  1. import java.util.*;
  2. public class Main{
  3. static String end = "12345678x";
  4. public static void swap(char[] arr,int x,int y){
  5. char temp = arr[x];
  6. arr[x] = arr[y];
  7. arr[y] = temp;
  8. }
  9. public static int bfs(String start){
  10. //key:String 存放12345678x这种格式的字符
  11. //value:int 存放start - key 这个状态需要多少步
  12. //最终的map.get(end)就是答案
  13. Map<String,Integer> map = new HashMap<>();
  14. //里面放12345678x这种格式的字符
  15. Queue<String> q = new LinkedList<>();
  16. //开始宽搜
  17. //先把头节点放入队列
  18. q.offer(start);
  19. //初始化头节点
  20. //根据上面的定义 start -> start所需的步数为0
  21. map.put(start,0);
  22. //用将字符串转成3 * 3的数组,用偏移量来表示哪些点可以走(可以交换)(可以走到x这个位置)
  23. int[] dx = {-1,0,1,0}, dy = {0,1,0,-1};
  24. while (!q.isEmpty()){
  25. //只要队列不空,就把队头拿出来,并把队头可以扩展的点放入
  26. String t = q.poll();
  27. if (t.equals(end)) return map.get(t);
  28. //然后对t做文章(扩展)
  29. //t是12345678x格式的字符,要找到x的下标,对应到3 * 3的矩阵,去找可以上下左右扩展的点
  30. int k = t.indexOf('x');
  31. int x = k / 3;
  32. int y = k % 3;
  33. for (int i = 0; i < 4; i++) {
  34. int a = x + dx[i];
  35. int b = y + dy[i];
  36. //将满足条件的点(没被用过且再矩阵內部)加入队列,更新map
  37. if (a >= 0 && b >= 0 && a < 3 && b < 3){
  38. //将满足条件的点()加入队列,更新map
  39. //拿到下一个点的状态,看看这个状态是否已经被遍历过了
  40. char[] arr = t.toCharArray();
  41. swap(arr,k,a * 3 + b);
  42. //此时的arr数组就是下一个可以走的点
  43. //将arr转成字符串
  44. String str = new String(arr);
  45. if (map.get(str) == null){
  46. //该点第一次遍历,更新map里的点并且把它放入队列
  47. map.put(str,map.get(t) + 1);
  48. q.offer(str);
  49. }
  50. //因为这里操作的是arr数组,并没有操作t,恢复现场可有可无
  51. }
  52. }
  53. }
  54. return -1;
  55. }
  56. public static void main(String[] args){
  57. Scanner sc = new Scanner(System.in);
  58. String start = "";
  59. for (int i = 0; i < 9; i++) {
  60. String s = sc.next();
  61. start += s;
  62. }
  63. System.out.println(bfs(start));
  64. }
  65. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55190
推荐阅读
相关标签
  

闽ICP备14008679号