• Sudoku Solver


    Write a program to solve a Sudoku puzzle by filling the empty cells.

    Empty cells are indicated by the character '.'.

    You may assume that there will be only one unique solution.

    A sudoku puzzle...

    class Solution {
    public:
        //检查当前位置的值是否符合要求
        bool check(vector<vector<char>>& board, int row, int col) {
            int n = board.size();
            int i, j;
            int tmp = board[row][col];
            //判断这一行
            for (i=0; i<n; i++) {
                if (i == row) {
                    continue;
                }
                if (board[i][col] == tmp) {
                    return false;
                }
            }
    
            //判断这一列
            for (i=0; i<n; i++) {
                if (i == col) {
                    continue;
                }
                if (board[row][i] == tmp) {
                    return false;
                }
            }
    
            //判断方块
            for (i = row / 3 * 3; i < row / 3 * 3 + 3; i++) {
                for (j = col / 3 * 3; j< col /3 * 3 + 3; j++) {
                    if (i == row && j == col) {
                        continue;
                    }
                    if (board[i][j] == tmp) {
                        return false;
                    }
                }
            }
    
            return true;
        }
        //获取下一个需要填写的位置,如果找到了就返回成功,并修改row 和col, 如果找不到就返回失败
        bool get_next_position(vector<vector<char>>& board, int &row, int &col) {
            int i;
            int j;
            int n = board.size();
    
            for (j=col; j<n; j++) {
                if (board[row][j] == '.') {
                    col = j;
                    return true;
                }
            }
    
            if (row == n - 1) {
                return false;
            }
    
            for (i=row+1; i < n; i++) {
                for (j=0; j < n; j++) {
                    if (board[i][j] == '.') {
                        row = i;
                        col = j;
                        return true;
                    }
                }
            }
            return false;
        }
        /*
         * board[i][j]赋值1,如果成功,找下一个空白进行赋值
         * 如果失败,board[i][j]++, 如果board[i][j]为9,仍然失败,对上一个空白进行++
         *
         * */
        bool solve(vector<vector<char>>& board, int i, int j) {
            //给当前位置赋值,如果赋值后检测OK,就找一个位置继续。
            //如果1-9都失败了,就返回失败
            board[i][j] = '1';
            while (board[i][j]<='9') {
                while (!check(board, i, j)) {
                    board[i][j]++;
                }
                //如果1-9都check失败,就讲当前位置设置为".",然后将返回上一个位置,并将内容++
                if (board[i][j] == ':') {
                    board[i][j] = '.';
                    return false;
                }
    
                int next_i = i;
                int next_j = j;
                //如果找不到下个,说明整个数组都遍历完了
                if (!get_next_position(board, next_i, next_j)) {
                    return true;
                }
                if (solve(board, next_i, next_j)) {
                    return true;
                } else {
                    board[i][j]++;
                }
            }
            board[i][j] = '.';
            return false;
        }
    
        void solveSudoku(vector<vector<char>>& board) {
            int i = 0;
            int j = 0;
            if (!get_next_position(board, i, j)) {
                return;
            }
            solve(board, i, j);
    
        }
    };
  • 相关阅读:
    在c#中使用全局快捷键
    把其他C/C++编译器集成到VC2005中
    零基础学习Oracle 10G视频教程
    异常处理 Exception
    序列化与反序列化 BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)
    MVC 数据验证
    MVC 路由规则
    分部类,分部方法 修饰符partial
    HttpRuntime类
    MVC 模型绑定
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/5184705.html
Copyright © 2020-2023  润新知