杪苡 2019-06-18 00:16 采纳率: 0%
浏览 274

八数码逆序问题求解!!详尽代码解释,小白学习数据结构中!

基本要求:在一个3×3的九宫格中有1—8这8个数字,混乱排序,一个空格随机地摆放在一个格子里,九宫格布局随机生成。现要求将该九宫格调整为正常按逆序的格式。
调整的规则是:每次只能将与空格(上、下或左、右)相邻的一个数字平移到空格中。
编程求解这一问题,并输出每一步求解过程(坐标:数据:移动方向)。图片说明

例:

4 7 2 => 8 7 6

1 0 6 => 5 4 3

8 3 5 => 2 1 0

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-10 10:18
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这是一个典型的动态规划问题,我们可以使用二维数组来存储每个位置的状态,然后从左到右遍历整个九宫格,对于每一个位置,我们计算出它能够到达的最远位置,并且更新这个状态。最后,我们将最远的位置标记为1,表示它是正确的结果。

    以下是C++代码实现:

    #include <iostream>
    using namespace std;
    
    const int MAX = 9;
    int dp[MAX][MAX];
    bool is_correct[MAX];
    
    void dfs(int x, int y) {
        if (x == 0 || y == 0 || x == MAX - 1 || y == MAX - 1) return;
        if (!is_correct[x][y]) {
            is_correct[x][y] = true;
            for (int i = 1; i <= MAX; ++i)
                dfs(x + i / 3, y + i % 3);
        }
    }
    
    void solve() {
        memset(dp, 0, sizeof(dp));
        memset(is_correct, false, sizeof(is_correct));
    
        for (int i = 0; i < 9; ++i) {
            for (int j = 0; j < 9; ++j) {
                if ((i + j) % 2 != 0 && dp[i][j] > 0) {
                    dfs(i, j);
                }
            }
        }
    
        cout << "正确结果: ";
        for (int i = 0; i < 9; ++i)
            for (int j = 0; j < 9; ++j)
                cout << dp[i][j] << ' ';
        cout << endl;
    }
    
    int main() {
        solve();
        return 0;
    }
    

    在这个代码中,我们首先初始化了一个二维数组dp和一个布尔型数组is_correct,分别用来记录当前位置是否已经被访问过以及当前位置是否是最远的位置。然后,我们使用dfs函数进行深度优先搜索,遍历整个九宫格,对于每个位置,如果它可以到达的最远位置被访问过,则跳过;否则,将其标记为已经访问过。最后,我们将所有被访问过的状态标记为true,表示它们都是有效的结果。

    在solve函数中,我们使用for循环对每个位置进行处理,对于每个位置,我们先判断它是否有最远位置被访问过,如果没有,我们就调用dfs函数进行深度优先搜索。在dfs函数中,我们使用递归的方式,从左到右遍历每一行,对于每个位置,我们都尝试将其标记为已经访问过,这样可以避免重复计算。当我们遇到无法到达的最远位置时,我们就跳过这个位置。当所有位置都经过了处理后,我们就得到了最终的结果。

    评论

报告相同问题?