洛谷P1379 八数码难题
1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了
2.朴素bfs,判重就用二分找hash;如果发现当前状态=要求状态,输出步数结束程序
上代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
;
long long hash[MAXHASH];
bool hashbook[MAXHASH];
;
];
;
void hinit(long long step,long long val){
){
hn++;
hash[hn]=val;
return;
}
;i<=;i++){
){
hinit_book[i]=;
hinit(step+,val*+i);
hinit_book[i]=;
}
}
}
bool hashput(long long val){
,r=hn;
for(;;){
if(l==r){
){
hashbook[l]=;
;
}else{
;
}
}
;
if(val>hash[mid]){
l=mid+;
}else{
r=mid;
}
}
}
struct uct1{
long long data;
long long pos;
long long step;
}que[];
long long mywap(long long data,long long pa,long long pb){
long long ans=data;
,-pb+)-data%(,-pb);
ans-=df;
ans+=df/pow(,-pb)*pow(,-pa);
df=data%(,-pa+)-data%(,-pa);
ans-=df;
ans+=df/pow(,-pa)*pow(,-pb);
return ans;
}
,tail=;
int main() {
hinit(,);
long long pig;
cin>>pig;
int bap=pig;
if(pig==end){
cout<<;
;
}
int pigpos;
;bap>;pigpos--){
==){
break;
}
bap=bap/;
}
){
pigpos=;
}
head=;
tail=;
que[tail].data=pig;
que[tail].pos=pigpos;
que[tail].step=;
tail++;
for(;head<tail;){
int tdata;
int tpos;
]={};
for(;;){
)%==&&flag[]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
tpos=que[head].pos+;
flag[]++;
})%==&&flag[]<){
]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
tpos=que[head].pos+;
}else{
tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
tpos=que[head].pos-;
}
flag[]++;
})%==&&flag[]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
tpos=que[head].pos-;
flag[]++;
}&&que[head].pos<=&&flag[]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
tpos=que[head].pos+;
flag[]++;
}&&que[head].pos<=&&flag[]<){
]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
tpos=que[head].pos+;
}else{
tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
tpos=que[head].pos-;
}
flag[]++;
}&&que[head].pos<=&&flag[]==){
tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
tpos=que[head].pos-;
flag[]++;
}else{
break;
}
if(tdata==end){
cout<<que[head].step+;
;
}
){
que[tail].data=tdata;
que[tail].pos=tpos;
que[tail].step=que[head].step+;
tail++;
}
}
head++;
}
;
}
其实还可以用双向bfs优化,算hash数组可以用康托展开
但懒得写了(逃)
洛谷P1379 八数码难题的更多相关文章
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- 洛谷 P1379 八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
- 洛谷 - P1379 - 八数码难题 - bfs
https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...
- 洛谷—— P1379 八数码难题
https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...
- 洛谷 P1379 八数码难题 题解
我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度. 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列. # ...
- 洛谷 P1379 八数码难题(map && 双向bfs)
题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...
随机推荐
- Spring MVC 学习总结(一)——MVC概要与环境配置(IDea与Eclipse示例)
一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...
- BZOJ3932 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=3932 题意:给出一些带有等级的线段,求一点上前K小个等级线段的等级之和 询问是对于每一个点询问前K ...
- 分布式监控系统开发【day37】:服务端生成配置数据(四)
一.目录结构 二.引子与代码 1.客户端获取服务列表接口 1.解决了什么问题 客户端要给我获取服务列表的的时候,他肯定要告诉他是谁?他怎么告诉我,客户端必须有一个id号 Saltsack你装一个客户端 ...
- java调用matlab绘图
一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...
- ACM-ICPC 2018 徐州赛区网络预赛 F Features Track(STL模拟)
https://nanti.jisuanke.com/t/31458 题意 有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向量的两个分量分别 ...
- kafka全部数据清空与某一topic数据清空
1. Kafka全部数据清空 kafka全部数据清空的步骤为: 停止每台机器上的kafka: 删除kafka存储目录(server.properties文件log.dirs配置,默认为“/tmp/ka ...
- JavaScript数据类型 String字符串类型
前言 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持 ...
- iTOP-4418开发板和6818开发板-第五路串口介绍
iTOP-4418开发板和6818开发板 的除去默认 4 个串口的配置和用法. 4418 的开发板最多支持 5 路串口,如下图所示,4418 的 datasheet. 6818 的开发板最多支持 ...
- 肺结节CT影像特征提取(三)——肺结节CT影像特征提取系统软件设计
肺结节的特征提取在临床中有着重要应用,在上篇文章已经对肺结节的基本特征和CT影像特征提取算法有了介绍,提出了三类肺结节CT影像特征提取算法.本文重点介绍肺结节CT影像特征提取系统的功能介绍及使用,利用 ...
- Docker: repository, image, container
1. 查看image: docker images 2. 查看信息: docker info 3. 搜索image: docker search [image_name], 比如: docker se ...