BFS魔板
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS魔板相关的知识,希望对你有一定的参考价值。
- 博客主页: https://blog.csdn.net/qq_50285142
- 欢迎点赞👍收藏✨关注❤留言 📝 如有错误,敬请指正
- 🎈虽然生活很难,但我们也要一直走下去🎈
题目链接
思路:
因为魔板只要三种移动的方式,我们可以逐层进行枚举,相当于对一颗三叉树进行BFS遍历(一层一层的遍历)
我们用字符串来记录移动时候的状态,每次移动到没有出现过的状态就将它对应的状态字符串加入到队列中,同时记录每个状态到达的前驱节点,这主要是用来最后的路径输出的。
最后输出的一定是最先出现的状态,必定是最短路径。
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int dx[]={-1,0,1,0,1,1,-1,-1},dy[]={0,1,0,-1,1,-1,1,-1};
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int mod = 1e9+7;
const int N = 2e5+5,M = 2e5+5;
int n,m;
string s,d;
map<string,int>mp;
map<string,pair<string,int> >pre;
string move0(string s)
{
string res;
for(int i=s.size()-1;i>=0;i--)
res += s[i];
return res;
}
string move1(string s)
{
string res;
res += s[3];
for(int i=0;i<=2;i++) res += s[i];
for(int i=5;i<=7;i++) res += s[i];
res += s[4];
return res;
}
string move2(string s)
{
string res = s;
char a = s[1],b = s[2],c = s[5],d = s[6];
res[1] = d,res[2] = a,res[5] = b,res[6]=c;
return res;
}
int bfs(string s,string d)
{
if(s==d) return 0;
queue<string>q;
q.push(s);
mp[s] = 0;
while(!q.empty() )
{
string t = q.front();
q.pop();
string st[3] = {move0(t),move1(t),move2(t)};
for(int i=0;i<3;i++)
{
if(!mp.count(st[i]))
{
mp[st[i]] = mp[t] + 1;
pre[st[i]] = {t,i};
q.push(st[i]);
if(st[i]==d)
return mp[st[i]];
}
}
}
return -1;
}
void solve()
{
string x;
for(int i=1;i<=8;i++)
{
int a;cin>>a;
x += char( a +'0');
}
string start = "12345678";
int res = bfs(start,x);
cout<<res<<'\\n';
string ans;
while(x!=start)
{
ans += (char)(pre[x].se+'A');
x = pre[x].fi;
}
reverse(ans.begin(),ans.end());
if(res>0) cout<<ans<<'\\n';
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0),cout.tie(0);
int _;
// cin>>_;
_ = 1;
while(_--)
{
solve();
}
return 0;
}
往期优质文章推荐
以上是关于BFS魔板的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 1430 - 魔板( 康托展开 + BFS预处理 )