0
点赞
收藏
分享

微信扫一扫

魔板----比较复杂的bfs

山竹山竹px 2022-01-09 阅读 53

题目链接

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
char g[2][4];
unordered_map<string,pair<char,string> >path;
unordered_map<string,int>dist;
void set(string state)
{
    for(int i=0;i<4;i++)g[0][i]=state[i];
    for(int i=7,j=0;i>=4;i--,j++)g[1][j]=state[i];
}
string get()
{
    string s="";
    for(int i=0;i<4;i++)s+=g[0][i];
    for(int i=3;i>=0;i--)s+=g[1][i];
    return s;
}
string move0(string state)
{
    set(state);
    for(int i=0;i<4;i++)swap(g[0][i],g[1][i]);
    return get();
}
string move1(string state)
{
    set(state);
    char a=g[0][3],b=g[1][3];
    for(int i=3;i>=1;i--)
    {
        g[0][i]=g[0][i-1];
        g[1][i]=g[1][i-1];
    }
    g[0][0]=a,g[1][0]=b;
    return get();
}
string move2(string state)
{
    set(state);
    int v=g[0][1];
    g[0][1]=g[1][1];
    g[1][1]=g[1][2];
    g[1][2]=g[0][2];
    g[0][2]=v;
    return get();
}
int bfs(string st,string ed)
{
    if(st==ed)return 0;
    queue<string>q;
    q.push(st);
    dist[st]=0;
    while(q.size())
    {
        string t=q.front();
        q.pop();
        string m[3];
        m[0]=move0(t);
        m[1]=move1(t);
        m[2]=move2(t);
        for(int i=0;i<3;i++)
        {
            if(dist.count(m[i]))continue;
            dist[m[i]]=dist[t]+1;
            q.push(m[i]);
            path[m[i]]={i+'A',t};
            if(m[i]==ed)return dist[ed];
        }
    }
    return -1;
}
int main()
{
    string st="",ed="";
    for(int i=1;i<=8;i++)st+='0'+i;
    int x;
    for(int i=1;i<=8;i++)
    {
        cin>>x;
        ed+=x+'0';
    }
    int step=bfs(st,ed);
    cout<<step<<endl;
    string res="";
    while(st!=ed)
    {
        res+=path[ed].first;
        ed=path[ed].second;
    }
    reverse(res.begin(),res.end());
    if(step>0)cout<<res<<endl;
}
举报

相关推荐

最小步数模型的BFS——魔板

0 条评论