洛谷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代 ...
随机推荐
- CF1059D Nature Reserve
原题链接 网络不好的可以到洛谷上去QwQ 题目大意 有N个点,求与y=0相切的,包含这N个点的最小圆的半径 输入输出样例 输入: 2 0 1 1 1 输出 0.625 感觉最多是蓝题难度? 首先无解的 ...
- tqdm的使用方法
Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator),使用pip就可以安装 使用方法主要是:t ...
- 老男孩Python全栈学习 S9 日常作业 001
1.简述变量命名规范 必须以字母.数字.下划线命名,且不能以数字开头 不能是python的关键字 不能以中文或者拼音作为变量名 命名格式推荐以驼峰式或者下划线连接命名 区分大小写 要有意义,具有可描述 ...
- 金融量化分析【day112】:量化平台的使用-第一个策略
一.策略代码 # 导入函数库 import jqdata #初始化函数,设定基准等等 def initialize(context): set_benchmark('000300.XSHG') g.s ...
- 快速安装Java环境
1.部署jdk8 jdk包地址:https://pan.baidu.com/s/1QNGpapGuex00F6HQ5pynHgtar -xzf jdk-8u60-linux-x64.tar.gz #安 ...
- 通俗易懂的vuex-demo
在main.js引入store.js
- @ReponseBody返回的json中文乱码-遁地龙卷风
我在mvc配置文件中加上下面这个配置就好了 <mvc:annotation-driven></mvc:annotation-driven>,需要在开头引用如下命名空间xmlns ...
- 智联python 技能摘取
- ActiveMQ的Destination高级特性
1. Composite Destinations 组合目的地 组合队列Composite Destinations : 允许用一个虚拟的destination代表多个destinations ...
- K-means clustering
K-means算法是一种迭代算法,步骤如下: 1.随机初始化K个聚类中心u1,u2,...,uk 2.根据每个样本和各个聚类中心的距离给每个样本打上标签(例如,x(i)与u3的距离最小,则x(i)的标 ...