八数码(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 ...
随机推荐
- Could not read settings.xml
这个问题为什么会发生? 其实不要想太多, 1.文件格式是utf-8 2.其中的报文格式非常重要,千万不能弄错,如果多了一处注释,就会发生以上问题,拼写的时候多注意语义
- 软件使用---Eclipse
代码提示快捷操作.这个叫做,内容分析(content assist) 1.设置自动提示: 2.设置快捷键:
- [转]jQuery.getJSON的缓存问题的解决办法
本文转自:http://mfan.iteye.com/blog/974132 今天做测试工作,发现了一个令我费解的问题,jquery的getJson方法在firefox上运行可以得到返回的结果,但是在 ...
- (转)DNS解析过程详解
DNS解析过程详解 原文:http://blog.csdn.net/crazw/article/details/8986504 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的 ...
- jenkins对测试脚本的构建步骤
使用Jenkins定时执行脚本 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,所以可用于定时执行python脚本. 环境准备:jdk1.7及以上+Jenkins[+tom ...
- c++关于map的find和count的使用
编程的时候比较常用,今天记录一下,以后备用. 使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find,返回的是被查 ...
- ajax多次请求的一个效果思路
首先页面加载时候显示遮罩层 jQuery(function() { show_dialog(); //tianxie(); }); 定义一个全局数组,用于存放问题id var qar = []; 循环 ...
- javaSE练习2——流程控制_2.2
一.假设某员工今年的年薪是30000元,年薪的年增长率6%.编写一个Java应用程序计算该员工10年后的年薪,并统计未来10年(从今年算起)总收入. package com.test; public ...
- ArcGisJS的layers-add-result事件总结
map.on("layers-add-result", initEditing);当地图控件中的所有图层加载完毕之后触发. 注意图层加载完成后返回的的结果:event. funct ...
- Android基础Activity篇——Toast
1.Toast Toast在英文中有烤面包的意思,而在安卓开发中是用来提醒用户的消息显示.我猜这里之所以用Toast为该功能命名可能是因为消息的弹出方式就像面包烤好了从面包机中弹出来一样. 2.使用T ...