AcWing 845. 八数码

https://www.acwing.com/problem/content/847/

#include<bits/stdc++.h>
using namespace std;
int bfs(string start)
{
    string end="12345678x";
    queue<string>q;  
    unordered_map<string,int>d;  //距离数组 
    q.push(start);  // 先把start放进去 
    d[start]=0;  //起点到起点的距离为0 
    int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
    while(q.size())
    {
        auto t=q.front();   
        q.pop();
        int distance =d[t];
        if(t==end) return distance;  //判断t是否为终点  如果是  就结束 
        //状态转移
        int k=t.find('x');   //先找到x的位置   返回x的下标 
        int x=k/3,y=k%3;    // 把一维数组下标转换为二维数组下标    3x3矩阵 
        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i]; //变化之后的坐标 
            if(a>=0&&a<3&&b>=0&&b<3)   //如果没有出界 
            {
                swap(t[k],t[a*3+b]);  //交换    状态更新  更新完之后 一定要恢复状态 
                if(!d.count(t))   //如果当前更新完之后的t没有被搜到过   那就找到了一个新的状态 
                {
                    d[t]=distance +1;     //距离加1 
                    q.push(t);  //压入队列 
                }
                swap(t[k],t[a*3+b]);  //恢复状态 
            }
    
            
         } 
    }
    return -1;
}
int main(){
    string start;  //初始给定的字符串 
    for(int i=0;i<9;i++){
        char c;
        cin>>c;
        start+=c;
    }
    cout<<bfs(start)<<endl;
} 

 

posted @ 2019-10-26 23:36  晴屿  阅读(185)  评论(0编辑  收藏  举报