P1379 八数码难题

点击查看代码
#include<bits/stdc++.h>
using namespace std;

string start_s;
string goal="123804765";

int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};

void bfs()
{
    if(start_s==goal){
        cout<<"0"<<endl;
        return;
    }
    map<string,int> d1,d2;
    queue<string> q1,q2;
    q1.push(start_s);
    q2.push(goal);
    d1[start_s]=0;
    d2[goal]=0;

    while(!q1.empty()&&!q2.empty()){
        if(q1.size()>q2.size()){
            swap(q1,q2);
            swap(d1,d2);
        }

        string curr = q1.front();
        q1.pop();
        int pos=curr.find('0');
        int x=pos/3;
        int y=pos%3;

        int dist=d1[curr];
        

        for(int i=0;i<4;i++){
            int nx=x+dx[i];
            int ny=y+dy[i];

            if(nx>=0&&nx<=2&&ny>=0&&ny<=2){
                string next_s;
                next_s=curr;
                swap(next_s[pos],next_s[3*nx+ny]);

                if(d2.count(next_s)){
                    cout<<dist+1+d2[next_s]<<endl;
                    return;
                }
                
                if(d1.find(next_s)==d1.end()){
                    q1.push(next_s);
                    d1[next_s]=dist+1;
                }
            }
            
        }
        
    }
}

int main()
{
    cin>>start_s;

    bfs();

    return 0;
}
posted @ 2026-01-15 21:29  AnoSky  阅读(4)  评论(0)    收藏  举报