zoukankan      html  css  js  c++  java
  • [Leetcode 103] 37 Sudoku Solver

    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.

    A sudoku puzzle...

    ...and its solution numbers marked in red.

    Analysis:

    The basic dfs problem. Notice the structure for DFS function. It's a well structured program abstraction.

    Also notice when judging whether there's conflict in a sub 3*3 grid, the start point is i/3 * 3 and j/3*3. Please don't forget to multiple the second 3. Or that's not right

    Code:

     1 class Solution {
     2 public:
     3     void solveSudoku(vector<vector<char> > &board) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         solve(board);
     7     }
     8     
     9 private:
    10     bool solve(vector<vector<char> > &board) {
    11         int r, c;
    12 
    13         if (noRemainingPos(board, r, c))
    14             return true;
    15 
    16         for (int i=1; i<=9; i++) {
    17             if (noConflict(board, r, c, i+'0')) {
    18                 board[r][c] = i+'0';   
    19                 if (solve(board)) return true;
    20                 board[r][c] = '.';
    21             }
    22         }
    23         
    24         return false;
    25     }
    26     
    27     bool noRemainingPos(const vector<vector<char> > &b, int &r, int &c) {
    28         for (int i=0; i<9; i++)
    29             for (int j=0; j<9; j++) {
    30                 if (b[i][j] == '.') {
    31                     r = i;
    32                     c = j;
    33                     return false;
    34                 }
    35                 
    36             }
    37         
    38         return true;
    39     }
    40     
    41     bool noConflict(const vector<vector<char> > &b, int r, int c, char n) {
    42         return noConf(b, r, 0, 1, 9, n) && noConf(b, 0, c, 9, 1, n) && noConf(b, r/3*3, c/3*3, 3, 3, n);    
    43     }
    44     
    45     bool noConf(const vector<vector<char> > &b, int r, int c, int rc, int cc, char n) {
    46         for (int i=r; i<r+rc; i++)
    47             for (int j=c; j<c+cc; j++) {
    48                 if (b[i][j] == n)
    49                     return false;
    50             }
    51         
    52         return true;
    53     }
    54     
    55 };
    View Code
  • 相关阅读:
    鼠标移入和鼠标移出的提示,和样式的转换
    HTML5——新特性,拖放
    关于订阅发布模式
    titanium环境配置
    Matlab与C混编的介绍
    一个相对健壮的node 静态http服务器
    阻赛非阻塞同步异步
    最近在做的事以及一些安排
    说一说js中__proto__和prototype以及原型继承的那些事
    PHP写的爬虫,爬指定网站页面上的各种图片
  • 原文地址:https://www.cnblogs.com/freeneng/p/3247565.html
Copyright © 2011-2022 走看看