八数码(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);
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/Lance1ot/p/8496212.html

时间: 2024-10-10 04:06:13

八数码(map版)的相关文章

c++ 八数码问题增强版

layout: post title: 八数码问题增强版 subtitle: c++ 八数码问题增强版 date: 2019-08-07 author: dainuofei header-img: img/post-bg-universe.jpg catalog: true tags: - BFS --- 题目描述 三行三列的数组,其元素值为0至8的数.现有如下的变换规则: 1: 将0与上面一行元素对换 2:将0与下面一行元素对换 3:将0与左面一行元素对换 4:将0与右面一行元素对换 如果已知

【9018:1368】八数码

1368: 八数码 时间限制: 1 Sec  内存限制: 1024 MB提交: 81  解决: 32[提交][状态][讨论版] 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入 输入初试状态,一行九个数字,空格用0表示. 输出 只有一行

HDU 1043 Eight八数码解题思路(bfs+hash 打表 IDA* 等)

题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原为初始状态 思路: 参加网站比赛时拿到此题目,因为之前写过八数码问题,心中暗喜,于是写出一套暴力bfs+hash,结果TLE呵呵 思路一:bfs+hash(TLE) 1 #include <cstdio> 2 #include <cstring> 3 #include <queu

八数码三种用时差距极大的写法

进化史,一种比一种长,一种比一种快.不过第三种似乎还不是最终形态. 第一种,傻逼级迭代加深. 去年十一月写的,那时候刚刚学迭代加深,敲了一个钟头才敲完,codevs上直接过,就没太管,觉得这是个水题.实际上呢,看后文. 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int sx,sy,lim,

HDU 3567 Eight II(八数码 II)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: center; font-family: 宋体; color: rgb(26,92,200); font-weight: bold; fo

cdoj 1380 Xiper的奇妙历险(2) [八数码问题 bfs + 预处理]

快要NOIP 2016 了,现在已经停课集训了.计划用10天来复习以前学习过的所有内容.首先就是搜索. 八数码是一道很经典的搜索题,普通的bfs就可求出.为了优化效率,我曾经用过康托展开来优化空间,甚至还用过A*来优化时间.不过这道题懒得写了,就一个普普通通的bfs,再加上一个stl 的map就水过了. 首先题目要求有多达10000组数据,依次搜索肯定是不行的,我试过用A*来写,第2组数据就会T掉,所以我们考虑用一个预处理.从末尾状态搜索所有可行的状态,并用一个map来存储答案.然后就很好写了.

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

题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状态逆向搜索,这样才不会超时.判重康托展开,哈希也可. POJ //#include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<string> #include<stack

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

毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限制又会有很多情况无法找到,然后果断放弃,改用广度搜索.  如果要改善代码效率还可以用双向搜索,即从起始状态和最终状态同时搜索,找到相同状态,这样搜索时间会缩短一半.此外还可以用A*(启发式算法)会显得高端很多. 题目要求: 在一个3*3的棋盘上,随机放置1到8的数字棋子,剩下一个空位.数字可以移动到

hdu 1034 Eight 传说中的八数码问题。真是一道神题,A*算法+康托展开

Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13506    Accepted Submission(s): 3855 Special Judge Problem Description The 15-puzzle has been around for over 100 years; even if you don'