# 解题思路

这题不难,主要就是考虑如何判重,如果直接在 $9$ 个位置上都比较一遍的话。你会得到下面的好成绩

所以考虑另一种方法:

将九个位置压成一个整数,并且因为只有九个数,所以不会超出 $int$,用 $set$ 判重,写一个 BFS 就过了

# 附上代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
struct node{
int map,zerox,zeroy,step;
};
int pos=;
queue<node>P;
set<int>S;
int dx[]={,,,-};
int dy[]={,-,,};
void bfs(node now)
{
while(!P.empty())
{
node now=P.front();
P.pop();
int map=now.map,x=now.zerox,y=now.zeroy,step=now.step;
if(map==pos)
{
printf("%d",step);
return ;
}
int nxt[][],k=map;
for(int i=;i<;i++)
{
int xx=dx[i]+x,yy=dy[i]+y;
if(xx>&&xx<&&yy>&&yy<)
{
k=map;
for(int i=;i>=;i--)
for(int j=;j>=;j--)
nxt[i][j]=k%,k/=;
nxt[x][y]=nxt[xx][yy],nxt[xx][yy]=;
int ps=,h[],o[];
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ps=ps*+nxt[i][j],h[nxt[i][j]]=i,o[nxt[i][j]]=j;
if(!S.count(ps))
{
S.insert(ps);
P.push((node){ps,h[],o[],step+});
}
}
}
}
}
int main()
{
char p;
int m=,x0,y0;
//scanf("%d",m);
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
cin>>p;
m=(p-'')+m*;
if(p=='') x0=i,y0=j;
}
}
S.insert(m);
P.push((node){m,x0,y0,});
bfs(P.front());
}

「 Luogu P1379 」 八数码难题的更多相关文章

  1. 「LuoguP1379」 八数码难题(迭代加深

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

  2. 【洛谷P1379】八数码难题(广搜、A*)

    八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...

  3. 【洛谷P1379】八数码难题 状压bfs

    对于这道题来说,每个时刻的状态是整个棋盘所有棋子的位置,即:任何一个棋子位置发生了移动,都会使得状态转移. 因此,需要采取将整个状态作为广搜的搜索对象,进行状态压缩.采用哈希得到每个状态的对应的数值, ...

  4. 【P1379】八数码难题(搜索+暴力)

    这个题真是... 不想说什么了,及其复杂和烦人的一道题.基础思路就是bfs,用两个队列分别进行0的位置的计算和每一步的状态..然而这个题最重要的一点在于判重,实际上可以康托展开用全排列的个数进行判重, ...

  5. 题解 P1379 【八数码难题】

    传送门 用STL中的queue,map,string写了个广搜,用一个string保存状态(见代码)注:STL比较慢,可以做一些优化(或者开O2) #include<iostream> # ...

  6. 题解【洛谷P1379】八数码难题

    题面 典型的\(\text{BFS}\). 双向广搜是一种对\(\text{BFS}\)的优化,它适用于起点和终点都明确的题目. 这里给出我的双向广搜模板. inline int bfs()//双向广 ...

  7. [luogu]P1379 八数码难题[广度优先搜索]

    八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...

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

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

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

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

随机推荐

  1. VS2012上添加SharePoint2013模板,SharePoint2013 Tool安装配置

    今天需要在SharePoint2013上做开发,但是安装的VS2012默认只有sharepoint2010的模板,因此需要安装配置好,这里我们通过Web平台安装程序4.0来配置的 Web 平台安装程序 ...

  2. 【141】Adobe Acrobat技巧

    目录: 去除PDF的水印 待定 待定 待定 待定 待定 待定 待定 1. 批量去除PDF文件的水印 用Adobe Acrobat打开PDF文件之后,右侧选择工具>页面>水印>删除,可 ...

  3. <hr />标签的颜色和粗细设定

    设置<hr />的颜色和粗细,不需要用到style,直接用标签的color和size属性: <hr color="red" size="0.5" ...

  4. HDU 5903 Square Distance (贪心+DP)

    题意:一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", ...

  5. [软件安装]MYSQL

    https://dev.mysql.com/downloads/repo/yum/ wget https://repo.mysql.com//mysql57-community-release-el7 ...

  6. [App Store Connect帮助]七、在 App Store 上发行(2.1)设定价格与销售范围:为您的 App 设定价格

    在您提交 App 以供审核之前,您必须为您的 App 设定一个价格,该价格将用于 App Store 的所有地区.如果您没有<付费应用程序协议>,则只能选择免费. 必要职能:“帐户持有人” ...

  7. 安装配置Eclipse Python开发插件PyDev

    一.PyDev安装的版本要求 PyDev是支持在Eclipse中进行Python程序开发的插件,Pydev官方的说法是需要安装 java 8 and Eclipse 4.6 (Neon),当然,你也可 ...

  8. 在ios Xcode10下小白都能解决library not found for -libstdc++.6.0.9

    写在前面 library not found for -libstdc++.6.0.9,今天做项目的时候碰到这个问题,解决的过程中遇到了目录路径不对的问题(不在通常的/Applications/Xco ...

  9. 依赖注入(二)Autofac简单使用

    Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...

  10. Taro 采坑日常

    组件事件传参只能在类作用域下的确切引用(this.handleXX || this.props.handleXX),或使用 bind. 组件中点击事件如下 // 组件 <AtListItem k ...