八数码(map版)
map真是个奇技淫巧好东西
可以十分简单的实现hash,当然速度就不敢保证了
因为九位数不算很大,完全可以用int存下,所以便将八数码的图像转换成一个int型的数字
#include<iostream>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
int d[4]={-3,-1,1,3};
struct node
{
int position;//用0表示空位,position为0的位置
int h;//状态
int s;//步数
};
int ten[11]={0,100000000,10000000,1000000,100000,10000,1000,100,10,1};//用于分离出某一格中的数字的数组
bool check(int p,int d)//判断是否合法。p是空位位置,d是移动个数
{
if(p+d<=0)
return false;
if(p+d>9)
return false;
if(p%3==1&&d==-1)//空位在最左边一列而且向左移
return false;
if(p%3==0&&d==1)//同上,左变为右
return false;
return true;
}
queue<node>q;
map<int,int> kkk;//用于hash的map
int main()
{
cin.sync_with_stdio(false);
int end;
//cout<<kkk.count(1);
cin>>end;//结束状态
if(end==123804765)//根据题目来的特判
{
cout<<0;
return 0;
}
node pass;//因为是广艘,用pass储存队首元素
pass.position=5;
pass.h=123804765;
pass.s=0;
q.push(pass);
while(!q.empty())
{
pass=q.front();
q.pop();
node k=pass;
for(int i=0;i<4;i++)//扩展状态
{
k=pass;
/*kkk[k.h]=0;
cout<<kkk[k.h];*/
if(check(k.position,d[i]))
{
int replace=k.h/ten[k.position+d[i]]%10;//取出要交换的数字
k.h=k.h-replace*ten[k.position+d[i]]+replace*ten[k.position];//交换
k.s++;
k.position=k.position+d[i];//更改空位位置
if(k.h==end)
{
cout<<k.s;
return 0;
}
if(!kkk[k.h])//如果没有被扩展到,入队
{
kkk[k.h]=1;
q.push(k);
}
}
}
}
}
八数码(map版)的更多相关文章
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- 八数码问题:C++广度搜索实现
毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...
- BFS(八数码) POJ 1077 || HDOJ 1043 Eight
题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...
- [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)
快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- A*八数码
帮同学写的八数码,启发式搜索 创建两个表open,close,分别用的stl中的优先队列priority_queue和map,好久没写过代码了,bug调了半天 #include <iostrea ...
- poj 1077-Eight(八数码+逆向bfs打表)
The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...
- HDU 3567 Eight II(八数码 II)
HDU 3567 Eight II(八数码 II) /65536 K (Java/Others) Problem Description - 题目描述 Eight-puzzle, which is ...
- P1379 八数码naive题,STL的胜利
八数码:我使用了map判重 结果一遍就轻松A题了. 关于map的用法: ①创建一个map map<char,int>m; map<string,long long int>m1 ...
随机推荐
- 转 python3中SQLLIT编码与解码之Unicode与bytes
#########sample########## sqlite3.OperationalError: Could not decode to UTF-8 column 'logtype' with ...
- 转 Python多版本管理-pyenv
#######for linux https://www.cnblogs.com/saneri/p/7642316.html 经常遇到这样的情况: 系统自带的Python是2.x,自己需要Python ...
- spring 事务 @EnableTransactionManagement原理
@EnableXXX原理:注解上有个XXXRegistrar,或通过XXXSelector引入XXXRegistrar,XXXRegistrar实现了 ImportBeanDefinitionRegi ...
- Python查看类或Module的版本号
>>> import keras >>> print keras.__version__ 1.2.0
- DexClassLoader和PathClassLoader
Android的ClassLoader体系 在Android中可以跟java一样实现动态加载jar,但是Android使用Dalvik VM,不能直接加载java打包jar的byte code,需要通 ...
- CharacterController控制的物体移动
CharacterController控制的物体移动: public class playerMove : MonoBehaviour { public float Speed; private C ...
- AndroidStudio项目提交到github最详细步骤
在使用studio开发的项目过程中有时候我们想将项目发布到github上,以前都是用一种比较麻烦的方式(cmd)进行提交,最近发现studio其实是自带这种功能的,终于可以摆脱命令行了. 因为自己也没 ...
- NASM在Ubuntu上的安装与简单使用
一 .安装NASM 1. 下载安装文件 地址是:http://www.nasm.us/pub/nasm/releasebuilds/2.11.08/ 2.解压(具体命令要根据压缩包的类型来选用) 3. ...
- 文件夹选择之FolderBrowserDialog控件
应用程序可能只允许用户选择文佳夹而非文件,例如在播放MP3时,用户可能把所有的MP3放在一个文佳夹内,在添加时,只要选择添加这个文佳夹,将会把在这个文件内的所有MP3添加的播放器里.在这里对播放器来说 ...
- 使用dtd--属性声明
<!ATTLIST 元素名 属性名称 属性类型 属性特点> 1.属性类型 类型 含义 CDATA 纯文本 enumerated 枚举类型 ID 以属性的方式唯一标识改元素,必须以字母开头 ...