循环次数较少,可以直接广搜

using namespace std;
string st,ed;
unordered_map<string, int> d;//记录每一个状态所需的交换次数
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
void bfs()
{
    queue<string> q;
    q.push(st);
    while(q.size())
    {
        string t=q.front();//从队列中取出一种状态
        q.pop();
        if(t==ed){cout<<d[ed];return;}//检查 是否已经满足目标状态
        for(int i=0;i<16;i++)//遍历当前状态的每一位
        {
            if(t[i]==ed[i])continue;//检查当前位的玩具是否符合要求
            int num=d[t];
            int x=i/4,y=i%4;//一维化二维
            for(int j=0;j<4;j++)
            {
               int sx=x+dx[j],sy=y+dy[j];
                if(sx<0||sx>=4||sy<0||sy>=4)continue;//边界判断
                swap(t[sx*4+sy],t[i]);//二维化一维并进行交换
                if(!d.count(t))//避免重复的情况放入
                {
                    d[t]=num+1;
                    q.push(t);
                }
//                  cout<<t<<endl;
                swap(t[sx*4+sy],t[i]);//恢复原状
            }
        }
    }
}
int main()
{
    string x;
    for(int i=0;i<4;i++)cin>>x,st+=x;
    for(int i=0;i<4;i++)cin>>x,ed+=x;
//     cout<<st<<endl<<ed;
    bfs();
}

代码是块砖,哪里需要哪里搬