Acwing八数码

此题用\(bfs\)

首先我们可以定义两个重要的数组

\(unordered\_map<string,int> d\)表示\(string\)距离\(start\)的交换次数

\(queue<string> q\)广搜数组

然后我们初始化后进行三个操作

1.将一维的坐标转化为二维的坐标(\(x=k/3,y=k \%3\)k表示一维中的位置)

2.进行向4个方向搜索,交换一次,如果没有变成过这样的状态,那么就更新。

3.恢复状态。

当变为目标状态"12345678x"时,输出\(d['12345678x']\)即可

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;


int bfs(string start)
{
    string end = "12345678x";
    unordered_map<string,int> d;//记录状态距离
    queue<string> q;//队列
    q.push(start);
    d[start] = 0;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        int dis = d[t];
        if(t == end) return dis;
        //状态转移
        int k = t.find('x');
        int x = k / 3, y = k % 3;
        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))
                {
                    d[t] = dis + 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 ch;
        cin >> ch;
        start += ch;
    }
    cout << bfs(start) << endl;
    return 0;
}
posted @ 2022-07-17 20:11  ljfyyds  阅读(40)  评论(0)    收藏  举报