P1379 八数码naive题,STL的胜利
八数码:我使用了map判重
结果一遍就轻松A题了。
关于map的用法:
①创建一个map
map<char,int>m;
map<string,long long int>m1;
很浅显。。。
②插入
m.insert(make_pair(19260817,"naive"));
m['R']=3;
③判重
我们只需让出现过的key的value值为1/true
那么是否出现过就是:if(m[2])
///
掌握了map的用法之后八数码就很ok了。
基本思想是广搜。我用字符串+结构体表示状态,写了4个函数为上下左右(其实没必要),以及一个check函数。然后就很显然了:
#include <cstdio>
#include <map>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
map<string,int>m; struct Node
{
string ss;
int k;
}; queue<Node>p;
string aim=""; void check(Node s)
{
if(s.ss==aim)
{
printf("%d",s.k+);
exit();
}
return;
} void up(Node s)
{
int i;
for(i=;i<=;i++) if(s.ss[i]=='') break;
if(i<) return;
//printf("up:i=%d ",i);cout<<s.ss;
swap(s.ss[i],s.ss[i-]);
//cout<<' '<<s.ss<<endl;
check(s);
if(m[s.ss]) return;
m[s.ss]=;
s.k++;
p.push(s);
return;
}
void down(Node s)
{
int i;
for(i=;i<=;i++) if(s.ss[i]=='') break;
if(i>) return;
swap(s.ss[i],s.ss[i+]);
check(s);
if(m[s.ss]) return;
m[s.ss]=;
s.k++;
p.push(s);
return;
}
void left(Node s)
{
int i;
for(i=;i<=;i++) if(s.ss[i]=='') break;
if(i==||i==||i==) return;
swap(s.ss[i],s.ss[i-]);
check(s);
if(m[s.ss]) return;
m[s.ss]=;
s.k++;
p.push(s);
return;
}
void right(Node s)
{
int i;
for(i=;i<=;i++) if(s.ss[i]=='') break;
if(i==||i==||i==) return;
swap(s.ss[i],s.ss[i+]);
check(s);
if(m[s.ss]) return;
m[s.ss]=;
s.k++;
p.push(s);
return;
}
void bfs()
{
while(!p.empty())
{
Node s=p.front();
p.pop();///取点
//cout<<s.ss<<endl;
up(s);
down(s);
left(s);
right(s);
}
return;
} int main()
{
string c;
cin>>c;
if(c==aim)
{
printf("");
return ;
}
m.insert(make_pair(c,));
Node a;
a.ss=c;
a.k=;
p.push(a);
bfs();
return ;
}
AC代码如下:
P1379 八数码naive题,STL的胜利的更多相关文章
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
- P1379 八数码问题
aoapc上的八数码问题,在luogu上也有类似的题,p1379,经典题目,lrj给出了一个算法,同时给出了三种判重的方法.本来想用std::queue改写一下,但是出了各种问题,只好抄代码ac掉这道 ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- luogu P1379 八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
- 【洛谷】P1379 八数码难题(bfs)
题目 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局 ...
- 洛谷 P1379 八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
随机推荐
- 【学亮IT手记】Servlet的生命周期
1.1 Servlet的生命周期 1.1.1 Servlet的生命周期概述 1.1.1.1 什么是生命周期 生命周期:一个对象从创建到销毁过程. 1.1.1.2 Servlet的生命周期(*****) ...
- select非group by字段的方法
只需要将非group by字段放进函数中即可:
- MyBatis映射文件5
返回map Map<String,Object> getEmpByResMap(Integer id); <select id="getEmpByResMap&qu ...
- js对字符串的一些操作方法
1.charCodeAt(index); 返回一个整数,代表下标位置上字符的Unicode的编码. 2.fromCharCode(code1,code2,code3,...); code1代表Unic ...
- flask保存 文件到本地
本篇队长介绍一下如何 把前端上传的文件保存 到 后端flask项目目录 首先讲一下上传.保存文件的思路: 第一步:前端通过post请求方式提交上传的文件 <input id="file ...
- Hibernate 连接不同数据库的方言
RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...
- Lodop部署web网站 客户端本地打印角色
Lodop用于客户端本地打印,部署到web网站非常简单,此博文介绍的是混合部署方式,该方式兼容所有浏览器,当浏览器支持np插件的时候,使用Lodop插件方式,浏览器不支持np插件,会用C-Lodop服 ...
- ubuntun与qt下载地址
http://mirrors.melbourne.co.uk/ubuntu-releases/ http://download.qt.io/archive/qt/5.4/5.4.0/ 使用u盘安装ub ...
- 第十九天 标准目录与time 模块
今日内容 1.目录规范 ***** (1)文件夹的规范写法 bin 可执行文件 conf 配置文件 core 主要业务逻辑 db 数据文件 lib 库 (公共代码 第三方模块) log 日志文件 ...
- 青蛙的约会 POJ - 1061 (exgcd)
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...