AcWing 1107. 魔板
原题链接
简单
作者:
hai阿卢
,
2021-03-09 13:08:10
,
所有人可见
,
阅读 309
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
string ed, st;
map<string, int> d;
map<string, pair<char, string> > p;
int g[2][4];
queue<string> q;
void set(string it)
{
for(int i = 0; i < 4; i++) g[0][i] = it[i];
for(int i = 0; i < 4; i++) g[1][i] = it[7 - i];
}
string get()
{
string res;
for(int i = 0; i < 4; i++) res += g[0][i];
for(int i = 3; i >= 0; i--) res += g[1][i];
return res;
}
string moveA(string it)
{
set(it);
for(int i = 0; i < 4; i++) swap(g[0][i], g[1][i]);
return get();
}
string moveB(string it)
{
set(it);
for(int i = 3; i > 0 ; i--) swap(g[0][i], g[0][i - 1]), swap(g[1][i], g[1][i - 1]);
return get();
}
string moveC(string it)
{
set(it);
swap(g[0][1], g[1][1]);
swap(g[1][1], g[1][2]);
swap(g[1][2], g[0][2]);
return get();
}
void Bfs(string ed, string st)
{
q.push(st);
d[st] = 0;
while(!q.empty())
{
string it = q.front();
q.pop();
string m[3];
m[0] = moveA(it);
m[1] = moveB(it);
m[2] = moveC(it);
for(int i = 0; i < 3; i++)
{
if(!d.count(m[i]))
{
d[m[i]] = d[it] + 1;
q.push(m[i]);
p[m[i]] = {'A' + i, it};
if(m[i] == ed) return ;
}
}
}
}
int main()
{
for(int i = 0; i < 8; i++)
{
int a;
cin >> a;
ed += a + '0';
st += i + '1';
}
Bfs(ed, st);
cout << d[ed] << endl;
string res;
if(d[ed])
{
while(st != ed)
{
res += p[ed].first;
ed = p[ed].second;
}
reverse(res.begin(), res.end());
cout << res << endl;
}
return 0;
}