前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >九宫格拼图问题(BFS)

九宫格拼图问题(BFS)

作者头像
灯珑LoGin
发布2022-10-31 14:17:34
3920
发布2022-10-31 14:17:34
举报
文章被收录于专栏:龙进的专栏

九宫格拼图问题就是在3*3的格子上摆放8张拼图,空出一个格子,玩家要借助这个空格上下左右移动完成拼图,求完成拼图最少要移动多少次

题目:ALDS1_13_B

其实这个问题可以看成是在移动空格,并且记录下经过的所有状态。

我们把九宫格按照下面的方式进行编号:

那么就可以用一个一维数组来存储这些格子。

设一维数组下标为a,对于x、y坐标,有如下关系:

x=a/3, y=a%3

然后就可以应用bfs来求解了。代码如下:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
#define N 3
#define N2 9
const int dx[] = {0, 0, -1, 1}; //分别对应上下左右移动
const int dy[] = {1, -1, 0, 0};
const string pth[] = {"u", "d", "l", "r"};

struct node
{
    string path = "";
    int f[N2];
    int space; //空格所在位置

    bool operator<(const node &p)const
    {
        for(int i=0;i<N2;++i)
        {
            if(f[i]==p.f[i])
                continue;
            return f[i]<p.f[i];
        }
        return false;
    }
};

bool is_target(node nd)
{
    for (int i = 0; i < 9; ++i)
    {
        if (nd.f[i] != i + 1)
            return false;
    }
    return true;
}

string bfs(node st)
{
    queue<node> Q;
    map<node, bool> mp;

    st.path = "";
    Q.push(st);
    mp[st] = true;
    node u, v;

    while (!Q.empty())
    {
        u = Q.front();
        Q.pop();

        if (is_target(u))
            return u.path;

        int sx = u.space / N;
        int sy = u.space % N;

        for (int i = 0; i < 4; ++i)
        {
            int tx = sx + dx[i];
            int ty = sy + dy[i];
            if (tx >= N || tx < 0 || ty >= N || ty < 0)
                continue;
            v = u;
            v.path += pth[i];
            swap(v.f[u.space], v.f[N * tx + ty]);
            v.space = N * tx + ty;

            if(!mp[v])
            {
                //确保没有存在过这条路径
                mp[v] = true;
                Q.push(v);
            }
        }
    }

    return "cannot_solve";
}

int main()
{
    node st;
    for (int i = 0; i < N2; ++i)
    {
        cin >> st.f[i];
        if (st.f[i] == 0)
        {
            st.space = i;
            st.f[i] = N2;
        }
    }
    string ans = bfs(st);
    if(ans!="cannot_solve")
        cout<<ans.length()<<endl;
}

转载请注明来源:https://www.longjin666.top/?p=1069

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年7月15日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档