数独的生成以及解答--回溯算法c++附详细代码

一,数独的规则

  1. 横向上9个数字满足1-9不重复;
  2. 竖向上9个数字满足1-9不重复;
  3. 将大网格拆分为9个3*3的小网格,每个小网格内同样满足1-9不重复

二,生成数独的思路

首先准备一个空的数独,从第一个格子开始,按照数独的规则,把1-9依次试探性的填入,如果合法,就填入.如果不合法就判断下一个数合不合法,这样,一直到把第81个格子填完,就生成了一个完整的数独,但是因为这样生成的数独是一个固定的,所以,现在我们要随机把它打乱,根据数独的特性,在同一个小九宫格中的行和行之间交换位置,列与列之间交换位置,数独依然成立,打个比方,第0行和第2行,交换位置,第0列和第2列交换位置,数独依然成立.

  这样随机打乱位置后,再根据要求的难度,随机挖空其中的一些格子,这样就生成了我们需要的数独题目了!

bool isValid(int row, int col, int num, vector<vector<char>>&board)
    {
        //检查行有没有重复的,如果有返回faulse
        for (int i = 0; i < board.size(); i++)
        {
            if (num == board[row][i]-'0')
            {
                return false;
            }
        }
        //检查列有没有重复的,如果有返回faulse
        for (int i = 0; i < board.size(); i++)
        {
            if (num == board[i][col]-'0')return false;
        }
        //检查数字所在的方块有没有重复的,如果有返回faulse
        int startrow = row / 3 * 3;
        int startcol = col / 3 * 3;
        int endrow = startrow + 3;
        int endcol = startcol + 3;
        for (int i = startrow; i < endrow; i++)
        {
            for (int j = startcol; j < endcol; j++)
            {
                if (num == board[i][j]-'0')return false;
            }
        }
        return true;

    }
    void swapCol(int m, int n, vector<vector<char>>& board)
    {
        vector<char>temp(board.size(), ' ');
        for (int i = 0; i < board.size(); i++)
        {
            temp[i] = board[i][m];
            board[i][m] = board[i][n];
            board[i][n] = temp[i];
        }
    }

    void se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值