bfs就是先出队,引变量,得到每一层的情况后判断最后将新情况入队,每次判断时都先出队

map:

#include<bits/stdc++.h>
using namespace std;
struct node{//结构体队列
    node(){}
    node(string ss, int tt){s = ss, t = tt;}
    string s;
    int t;
};
int cnt = 0; //统计计算了多少次
map<string, bool> mp;//map判重
queue<node> q;
void solve(){
    while(!q.empty()){
        node now = q.front();
        q.pop();
        string s = now.s;
        int step = now.t;
        if(s == "087654321"){        //到目标了
            cout << step << endl;    //输出跳跃步数
            cout << cnt << endl;     //计算了 1451452 次
            break;
        }
        int i;
        for(i = 0 ; i < 10 ; i++)    //找到盘子的位置
            if(s[i] == '0')
                break;
        for(int j = i - 2 ; j <= i + 2 ; j++){  //4种跳法
            int k = (j + 9) % 9;
            if(k == i)    continue;               //这是当前状态,不用检查
            string news = s;
            char tmp = news[i];
            news[i] = news[k];
            news[k] = tmp;  //跳到一种情况
            cnt ++;
            if(!mp[news]){         //判重:这个情况没有出现过
                mp[news] = true;
                q.push(node(news, step + 1));
            }
        }
    }
}
int main(){
    string s = "012345678";
    q.push(node(s, 0));
    mp[s] = true;
    solve();
    return 0;
}

set判重:

#include<bits/stdc++.h>
using namespace std;
struct node{
    node(){}
    node(string ss, int tt){s = ss, t = tt;}
    string s;
    int t;
};
set<string> visited;//已经搜索过的局面
queue<node> q;
void solve(){
    while(!q.empty()){
        node now = q.front();
        q.pop();
        string s = now.s;
        int step = now.t;
        if(s == "087654321"){        //到目标了
            cout << step << endl;    //输出跳跃步数
            break;
        }
        int i;
        for(i = 0 ; i < 10 ; i++) //找到盘子的位置
            if(s[i] == '0')
                break;
        for(int j = i - 2 ; j <= i + 2 ; j++){  //4种跳法
            int k = (j + 9) % 9;
            if(k == i)    continue;               //这是当前状态,不用跳
            string news = s;
            char tmp = news[i]; 
            news[i] = news[k]; 
            news[k] = tmp;  //跳到一种情况
            if(visited.count(news)==0){         //判重:这个情况没有出现过
                visited.insert(news);
                q.push(node(news, step + 1));
            }
        }
    }
}
int main(){
    string s = "012345678";
    q.push(node(s, 0));
    solve();
    return 0;
}