https://daniu.luogu.org/problem/show?pid=1379

题目描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入输出格式

输入格式:

输入初始状态,一行九个数字,空格用0表示

输出格式:

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

输入输出样例

输入样例#1:

  1. 283104765
输出样例#1:

  1. 4
  2.  
  3. BFS搜索每种移动的状态,hash判重
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <queue>
  4.  
  5. #define swap(a,b) {int tmp=a; a=b; b=tmp; }
  6. const int op[][]={{,,},
  7. {,,},
  8. {,,}};
  9. bool vis[];
  10. struct Checkerboard {
  11. int step;
  12. int map[][];
  13. Checkerboard() { step=; memset(map,,sizeof(map)); }
  14. } u;
  15. std::queue<Checkerboard>que;
  16. int fx[]={,,,-};
  17. int fy[]={,,-,};
  18. char s[];
  19.  
  20. inline bool print(Checkerboard x)
  21. {
  22. for(int i=; i<; ++i)
  23. for(int j=; j<; ++j)
  24. if(x.map[i][j]!=op[i][j]) return ;
  25. return true;
  26. }
  27. inline int BFS()
  28. {
  29. que.push(u);
  30. for(Checkerboard v; !que.empty(); )
  31. {
  32. v=u=que.front(); que.pop();
  33. int tmp=,t=,k=;
  34. for(int i=; i<; ++i)
  35. for(int j=; j<; ++j)
  36. tmp+=k*u.map[i][j],t++,k*=t;
  37. vis[tmp]=;
  38. if(print(u)) return u.step;
  39.  
  40. int x,y;
  41. for(int i=; i<; ++i)
  42. for(int j=; j<; ++j)
  43. if(u.map[i][j]==)
  44. {
  45. for(int k=; k<; ++k)
  46. {
  47. x=fx[k]+i,y=fy[k]+j;
  48. if(x>=&&y>=&&x<&&y<)
  49. {
  50. v.map[i][j]=v.map[x][y];
  51. v.map[x][y]=;
  52. v.step=u.step+;
  53. int tmp=,t=,k=;
  54. for(int i=; i<; ++i)
  55. for(int j=; j<; ++j)
  56. tmp+=k*v.map[i][j],t++,k*=t;
  57. if(!vis[tmp])
  58. vis[tmp]=,que.push(v);
  59. v=u;
  60. }
  61. }
  62. goto STEP;
  63. }
  64. STEP:;
  65. }
  66. return ;
  67. }
  68.  
  69. int Presist()
  70. {
  71. scanf("%s",s);
  72. for(int i=; i<; ++i) u.map[][i]=s[i]-'';
  73. for(int i=; i<; ++i) u.map[][i%]=s[i]-'';
  74. for(int i=; i<; ++i) u.map[][i%]=s[i]-'';
  75. printf("%d\n",BFS());
  76. return ;
  77. }
  78.  
  79. int Aptal=Presist();
  80. int main(){;}

洛谷—— P1379 八数码难题的更多相关文章

  1. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  2. 洛谷——P1379 八数码难题

    P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...

  3. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

  4. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  5. 洛谷 P1379 八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  6. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

  7. 洛谷P1379 八数码难题

    传送门 1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了 2.朴素bfs,判重就用二分找hash:如果发现当前状态=要求状态,输出步数结束程序 上代码 # ...

  8. 洛谷 P1379 八数码难题 题解

    我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度. 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列. # ...

  9. 洛谷 P1379 八数码难题(map && 双向bfs)

    题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...

随机推荐

  1. javaEE框架获取和传参要使用的类和接口

    1:spring  2:struts2获取前台数据(action中获取) //4修改用户密码. public String updateUserPassword() throws Exception{ ...

  2. 一种高兼容性的JavaBean序列化方案

    在对JavaBean做序列化时,我们可能在某些场景希望前后兼容性好一些.比如所有的javaBean都序列化后保存在数据库,用的时候需要反序列化创建.随着业务的发展,数据模型可能会进行变更,那么原来的数 ...

  3. JavaSE 基础习题整理 - 面向对象篇

    大家好,今天空闲时间整理了一份JavaSE面向对象的常用习题,喜欢的朋友可以关注我.习题来自互联网,不喜勿喷 1.定义长方形类,含: 属性:宽.高(整型): 方法:求周长.面积: 构造方法3个:(1) ...

  4. Sql批量插入方法

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  5. hdu2029

    http://acm.hdu.edu.cn/showproblem.php?pid=2029 #include<stdio.h> #include<string.h> #inc ...

  6. 使用HBuilder新建项目

    依次点击文件→新建→选择Web项目(按下Ctrl+N,W可以触发快速新建(MacOS请使用Command+N,然后左键点击Web项目)) 如上图,请在A处填写新建项目的名称,B处填写(或选择)项目保存 ...

  7. servlet范围:数据共享

    数据共享: 请求转发:request.getDispatcher("相对路径").forward(request,response) 重定向:response.sendRedire ...

  8. 【Leetcode】115. Distinct Subsequences

    Description: Given two string S and T, you need to count the number of T's subsequences appeared in ...

  9. unity多语言本地化

    简介 嗯...一般来说做游戏啥的都不会只发一个国家,但是每个国家语言不同,就存在多语言本地化的问题,然后直接用过一个通过xml完成本地化的东东,然后策划反馈不会修改xml,扔给我一个excel让我自己 ...

  10. MySQL关于视图的创建

    -- 视图就是一条select 语句 执行后返回结果集,是一种虚拟表,是一个逻辑表 -- 方便操作,减少复杂的SQL语句,增加可读性,更加安全一些 create view demo_view as s ...