精易论坛

标题: 求解数独 改自超级用户 侵删 [打印本页]

作者: 明天自然醒    时间: 2023-4-9 00:22
标题: 求解数独 改自超级用户 侵删
求解使用状态压缩+回溯。
状态压缩


回溯





[C++] 纯文本查看 复制代码
class Solution {

private:
    bitset<9> getPossibleStatus(int x, int y)
    {
        return ~(rows[x] | cols[y] | cells[x / 3][y / 3]);
    }

    vector<int> getNext(vector<vector<char>>& board)
    {
        vector<int> ret;
        int minCnt = 10;
        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board.size(); j++)
            {
                if (board[j] != '.') continue;
                auto cur = getPossibleStatus(i, j);
                if (cur.count() >= minCnt) continue;
                ret = { i, j };
                minCnt = cur.count();
            }
        }
        return ret;
    }

    void fillNum(int x, int y, int n, bool fillFlag)
    {
        rows[x][n] = (fillFlag) ? 1 : 0;
        cols[y][n] = (fillFlag) ? 1 : 0;
        cells[x / 3][y / 3][n] = (fillFlag) ? 1 : 0;
    }

    bool dfs(vector<vector<char>>& board, int cnt)
    {
        if (cnt == 0) return true;

        auto next = getNext(board);
        auto bits = getPossibleStatus(next[0], next[1]);
        for (int n = 0; n < bits.size(); n++)
        {
            if (!bits.test(n)) continue;
            fillNum(next[0], next[1], n, true);
            board[next[0]][next[1]] = n + '1';
            if (dfs(board, cnt - 1)) return true;
            board[next[0]][next[1]] = '.';
            fillNum(next[0], next[1], n, false);
        }
        return false;
    }

    vector<bitset<9>> rows;
    vector<bitset<9>> cols;
    vector<vector<bitset<9>>> cells;

public:

    void solve(vector<vector<char>>& board)
    {
        rows = vector<bitset<9>>(9, bitset<9>());
        cols = vector<bitset<9>>(9, bitset<9>());
        cells = vector<vector<bitset<9>>>(3, vector<bitset<9>>(3, bitset<9>()));

        int cnt = 0;
        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board.size(); j++)
            {
                cnt += (board[j] == '.');
                if (board[j] == '.') continue;
                int n = board[j] - '1';
                rows |= (1 << n);
                cols[j] |= (1 << n);
                cells[i / 3][j / 3] |= (1 << n);
            }
        }
        dfs(board, cnt);
    }
};








秒出结果

数独.zip (228.31 KB, 下载次数: 56)

原贴
易语言数独,当前论坛最完美的数独哦!!(为作业No.94的源码)
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14191541
(出处: 精易论坛)



作者: 醉卧美人膝    时间: 2023-4-9 07:49

作者: 曲终人散    时间: 2023-4-9 08:39
谢谢分享学习一下
作者: ゞωǒ天堂牧心    时间: 2023-4-9 11:37
太长看不懂
作者: cqcc    时间: 2023-4-9 12:20
没事弄个80个数字的出来
作者: 杨明煜    时间: 2023-4-9 18:07
支持分享.....................
作者: qyclangman    时间: 2023-4-9 20:31
#在这里快速回复# 谢谢楼主分享 谢谢楼主分享
作者: lqylbh    时间: 2023-4-9 21:18
谢谢分享学习一下
作者: 光影魔术    时间: 2023-4-9 23:08
谢谢楼主开源,正好需要
作者: 396384183    时间: 2023-4-10 00:06
好东西,收下了。。。
作者: 凉忆亦凉心    时间: 2023-4-10 07:21
谢谢大佬分享 支持支持
作者: 亿万    时间: 2023-4-10 13:53
支持开源~!感谢分享
作者: Conquer    时间: 2023-4-10 21:40
谢谢分享学习一下
作者: 灵感吖    时间: 2023-4-11 11:12
支持一下,学习看看~~~
作者: xxx159357    时间: 2023-4-13 10:09
好,太好了
作者: 喵芣可言    时间: 2023-4-13 12:02
已经顶贴,感谢您对论坛的支持!
作者: sanclyj    时间: 2023-4-13 21:53
求解数独 改自超级用户
作者: 精易论坛龙    时间: 2023-4-18 19:55
牛,
作者: 我喜欢学习    时间: 2023-4-23 12:25

好,太好了
作者: lm88818    时间: 2024-1-29 09:46
支持开源~!感谢分享
作者: 469207978    时间: 2024-4-16 23:28
不能解其他答案?
作者: 469207978    时间: 2024-4-16 23:35
DLL 易语言源码有吗




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4