描述
如图 所示:
有9只盘子,排成1个圆圈。 其中8只盘子内装着8只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1~8
每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,
并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e9;
bool flag[maxx]={0};
int st=123456789;
int a[15];
int ed=876543219;
int dis[4]={1,-1,2,-2};
queue<int>q;
queue<int>tt;
int id=0;
void bfs()
{
int s=st,i,now;
q.push(s);
tt.push(0);
while(1)
{
//cout<<"1"<<endl;
i=9;
s=q.front();
//cout<<"s="<<s<<endl;
flag[s]=1;
while(s>0)
{
i--;
a[i]=s%10;
if(a[i]==9)
now=i;
s/=10;
}
//cout<<"i="<<i<<endl;
for(int k=0;k<4;k++)
{
int sum=0;
swap(a[now],a[(now+dis[k]+9)%9]);
/*for(int i=0;i<9;i++)
{
cout<<a[i]<<" ";
}*/
//cout<<endl;
for(int j=0;j<9;j++)
{
sum*=10;
sum+=a[j];
}
// cout<<"sum="<<sum<<endl;
if(sum==ed)
{
id=1;
cout<<tt.front()+1<<endl;
break;
}
if(!flag[sum])
{
q.push(sum);
tt.push(tt.front()+1);
//cout<<tt.front()<<endl;
flag[sum]=1;
}
swap(a[now],a[(now+dis[k]+9)%9]);
}
q.pop();
tt.pop();
if(id) break;
}
}
int main()
{
bfs();
return 0;
}