题目传送门

解题思路:

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

AC代码:

 #include<cstdio>
#include<iostream>
#include<map>
#include<queue> using namespace std; int a[][],n;
int ans = ;
const int dx[]={-,,,},dy[]={,-,,};
map<int,int> m; inline void bfs() {
queue<long long> q;
q.push(n);
m[n] = ;
while(!q.empty()) {
int u = q.front();
q.pop();
int x = ,y= ,n = u;
if(u == ans) break;
for(int i = ;i >= ; i--)
for(int j = ;j >= ; j--) {
a[i][j] = n % ;
n /= ;
if(!a[i][j]) x = i,y = j;
}
for(int i = ;i < ; i++) {
int nx = x + dx[i],ny = y + dy[i],ns = ;
if(nx < || ny < || nx > || ny > ) continue;
swap(a[nx][ny],a[x][y]);
for(int i = ;i <= ; i++)
for(int j = ;j <= ; j++)
ns = ns * + a[i][j];
if(!m.count(ns)) {
m[ns] = m[u] + ;
q.push(ns);
}
swap(a[nx][ny],a[x][y]);
}
}
} int main()
{
scanf("%d",&n);
bfs();
printf("%d",m[]);
return ;
}

普通bfs

emmm,虽然普通bfs能A,但还是感觉太慢,所以试了一下双向bfs.

 #include<cstdio>
#include<iostream>
#include<queue>
#include<map> using namespace std; int a[][],n,n1 = ;
int x,y;
int wayx[] = {,-,,},wayy[] = {,,,-};
map<int,int> p,sum; inline void juzhen(int o) {
for(int i = ;i >= ; i--)
for(int j = ;j >= ; j--) {
a[i][j] = o % ;
o /= ;
if(a[i][j] == ) x = i,y = j;
}
} inline void double_bfs() {
if(n1 == ) return ;
queue<int> step[];
step[].push(n);
step[].push(n1);
sum[n] = ;
sum[n1] = ;
p[n] = ;p[n1] = ;
int deep = ,s;
while(!step[].empty() || !step[].empty()) {
int i = ;
while(i < ) {
if(sum[step[i].front()] != deep) {
i++;
continue;
}
s = step[i].front();
step[i].pop();
juzhen(s);
for(int w = ;w < ; w++) {
int xx = x + wayx[w];
int yy = y + wayy[w];
if(xx < || xx > || yy < || yy > ) continue;
swap(a[x][y],a[xx][yy]);
int pp = ;
for(int j = ;j <= ; j++)
for(int u = ;u <= ; u++)
pp = pp * + a[j][u];
if(p.count(pp)) {
if(p[pp] == - i) {
if(p[pp] == )
printf("%d",(deep + ) * );
else
printf("%d",deep * + );
return ;
}
}
else {
step[i].push(pp);
sum[pp] = sum[s] + ;
p[pp] = i;
}
swap(a[x][y],a[xx][yy]);
}
}
deep++;
}
} inline void tepan() {
if(n == n1) printf("");
if(n == n1) n = n1 = ;
} int main()
{
scanf("%d",&n);
tepan();
double_bfs();
return ;
}

双向bfs

双向bfs确实快很多很多,普通bfs耗时7.38s,而双向bfs只耗时291ms,快了25倍!!!!!!

洛谷 P1379 八数码难题(map && 双向bfs)的更多相关文章

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

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

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

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

  3. 洛谷P1379八数码难题

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

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

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

  5. 洛谷P1379 八数码难题

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

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

    https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...

  7. 洛谷 P1379 八数码难题

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

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

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

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

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

随机推荐

  1. 在 CentOS 中部署 KMS 服务器(vlmcsd)

    准备 vlmcsd 下载 vlmcsd 本文使用的 vlmcsd 版本为 svn1111,支持的产品: Windows Vista – 10Windows Server 2008 - 2016Offi ...

  2. Docker安装,基本概念,执行流程,生命周期简介

    Docker基本概念 在使用Docker前,首先要先知道Docker中这几个常用的概念: 镜像:镜像是文件,只读的,提供了运行完整软硬件应用程序的集装箱. 容器:是镜像的实例,由Docker负责创建, ...

  3. 机器学习(ML)一之 Linear Regression

    一.线性回归 1.模型 2.损失函数 3.优化函数-梯度下降 #!/usr/bin/env python # coding: utf-8 import torch import time # init ...

  4. 2-Java基本数据类型和运算符

    目录 Java基本类型 Java数据类型转换 Java运算符 1.Java基本类型 1.1.boolean布尔 - 只有true和false两种值,在内存中占1bits(位),默认是false 1.2 ...

  5. 经典SQL50句

    50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...

  6. Hive 数据类型 + Hive sql

    Hive 数据类型 + Hive sql 基本类型 整型 int tinyint (byte) smallint(short) bigint(long) 浮点型 float double 布尔 boo ...

  7. Bulma CSS - 模块化

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma框架 ...

  8. HTML元素 和 CSS (9.23 第十天)

    HTML元素分类:块级元素和内联元素块级元素:标签元素会以新行开始或结束<h1><p><table>等内联元素:显示数据不会以新行开始<a><im ...

  9. P 1034 有理数四则运算

    转跳点:

  10. ZOJ - 2671 Cryptography(线段树+求区间矩阵乘积)

    题意:已知n个矩阵(下标从1开始),求下标x~y区间矩阵的乘积.最多m次询问,n ( 1 <= n <= 30,000) and m ( 1 <= m <= 30,000). ...