八数码

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版)的更多相关文章

  1. A*算法 -- 八数码问题和传教士过河问题的代码实现

    前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...

  2. 八数码问题:C++广度搜索实现

    毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...

  3. BFS(八数码) POJ 1077 || HDOJ 1043 Eight

    题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...

  4. [cdoj1380] Xiper的奇妙历险(3) (八数码问题 bfs + 预处理)

    快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚 ...

  5. Codevs 1225 八数码难题

    1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...

  6. A*八数码

    帮同学写的八数码,启发式搜索 创建两个表open,close,分别用的stl中的优先队列priority_queue和map,好久没写过代码了,bug调了半天 #include <iostrea ...

  7. 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 ...

  8. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...

  9. P1379 八数码naive题,STL的胜利

    八数码:我使用了map判重 结果一遍就轻松A题了. 关于map的用法: ①创建一个map map<char,int>m; map<string,long long int>m1 ...

随机推荐

  1. Vue自定义指令实现按钮级权限控制功能

    思路: 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到sessionStorage中,保证刷新页面后能记住 ...

  2. vue快速入门(二)

    工程搭建完成,接下来如何使用. 首先找到src\rooter\index.js文件 这里是路由文件配置要访问的组件,这个会在后期说明 这里的components/A 是组件里边的 需要手动 创建A.v ...

  3. springboot 启动的java进程默默终止

    首先说明这是一个灵异事件......... 场景1 :把之前用map实现的缓存用Redis重构,高高兴兴上线更新,10 分钟后,老板告诉我,项目停了,what ??? 像我这么帅气,英俊,聪明的人,更 ...

  4. leetcode 197. Rising Temperature sql_Date用法

    https://leetcode.com/problems/rising-temperature/description/ 题目需要选出今天比昨天气温高的ID 用join,默认是inner join需 ...

  5. iTween Scale缩放

    void Start () { //键值对儿的形式保存iTween所用到的参数 Hashtable args = new Hashtable(); //放大的倍数 args.Add(, , )); / ...

  6. 源码剖析Linux epoll实现机制及Linux上惊群

    转载:https://blog.csdn.net/tgxallen/article/details/78086360 看源码是对一个技术认识最直接且最有效的方式了,之前用Linux Epoll做过一个 ...

  7. [转]25个HTML5和JavaScript游戏引擎库

    本文转自:http://www.open-open.com/news/view/27c6ed 1. The GMP JavaScript Game Engine GMP是一个基于精灵2-D游戏,它可以 ...

  8. jQuery源码解读 --- 整体架构

    最近学习比较忙,感觉想要提高还是要读源码,所以准备考试这个考试结束就开始读jquery源码啦,加油~

  9. JEECMS站群管理系统-- 标签的配置流程

    以cms_content_list为例,首先,每一个标签的声明都是在jeecms-context.xml中进行的, <?xml version="1.0" encoding= ...

  10. 利用COM组件实现对WORD书签处写入值

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Wo ...