步数示例都是正确的,但步骤没有一个一样
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+5;
const ll INF=0x7fffffffffffff;
inline ll read(){
ll cnt=0,flag=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') flag=-1;c=getchar();}
while(c>='0'&&c<='9') cnt=(cnt<<1)+(cnt<<3)+(c^48),c=getchar();
return flag*cnt;
}
struct node
{
string s;
};
queue<node> q[2];
map<string,pair<ll,vector<ll> > > vis[2];
ll a[14][6];
inline void bfs(node start,node end)
{
q[0].push(start),q[1].push(end);
vis[0][start.s].first=0,vis[1][end.s].first=0;
ll op=0;
while(!q[op].empty())
{
node x=q[op].front();
q[op].pop();
if(vis[op^1][x.s].first)
{
printf("%lld\n",vis[op][x.s].first+vis[op^1][x.s].first);
vector<ll> v=vis[0][x.s].second;
for(ll i=0;i<(ll)v.size();++i) printf("%lld ",v[i]);
v=vis[1][x.s].second;
for(ll i=(ll)v.size()-1;i>=0;--i) printf("%lld ",v[i]);
exit(0);
}
for(ll i=1;i<=12;++i)
{
node y=x;
ll tmp=a[i][y.s[i]-'0'];
(y.s[i]=='4')?(y.s[i]='1'):(y.s[i]+=1);
(y.s[tmp]=='4')?(y.s[tmp]='1'):(y.s[tmp]+=1);
if(!vis[op][y.s].first)
{
vis[op][y.s].first=vis[op][x.s].first+1;
vis[op][y.s].second=vis[op][x.s].second;
vis[op][y.s].second.push_back(i);
q[op].push(y);
}
}
op^=1;
}
}
int main()
{
node start,end;
for(ll i=1;i<=12;++i)
{
for(ll j=1;j<=5;++j)
{
ll x=read();
if(j==1)
{
start.s+=char(x+'0');
}
else
{
a[i][j-1]=x;
}
}
}
start.s=" "+start.s;
end.s=" 111111111111";
bfs(start,end);
return 0;
}
//THIS[10DATA[7IS]]MADE[8BY[9NETTLE]]
//570 877