37. Sudoku Solver

73 篇文章 1 订阅
8 篇文章 0 订阅

Problem

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.

enter image description here
A sudoku puzzle…

enter image description here

Solution

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        solveSudokudfs(board);
    }

    bool solveSudokudfs(vector<vector<char> > &board)  
    {  
        for(int i = 0; i < 9; i++)  
            for(int j = 0; j < 9; j++)  
            {  
                if(board[i][j] == '.')  
                {  
                    for(int k = 1; k <= 9; k++)  
                    {  
                        board[i][j] = '0' + k;  
                        if(isValid(board,i,j) && solveSudokudfs(board))  
                            return true;  
                        //回溯
                        board[i][j] = '.';  
                    }  
                    return false;  
                }  
            }  
        return true;  
    }  
    bool isValid(vector<vector<char> > &board, int row, int col) {  
        int i,j;  
        //查看同一列是否有重复
        for(i = 0; i < 9; i++)  
            if(i != row && board[i][col] == board[row][col])  
                return false;  
        //查看同一行是否有重复
        for(j = 0; j < 9; j++)  
            if(j != col && board[row][j] == board[row][col])  
                return false;  
        //小九宫格内是否有重复, x,y 是小9宫格的左上角的坐标
        int x = row/3*3;  
        int y = col/3*3;  
        for(i = 0; i < 3; i++)  
            for(j = 0; j< 3; j++)  
                if(x+i != row && y+j != col && board[x+i][y+j] == board[row][col])  
                    return false;  
        return true;  
    }  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值