zoukankan      html  css  js  c++  java
  • Sudoku Solver [LeetCode]

    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.

    Summary: finds the cell which has the least candidates first, then checks all candidates in the cell.

     1    vector<int> findLeastCandidate(vector<vector<char> > &board, vector<int> &out_digits){
     2         vector<int> idx;
     3         int candidate_num = 10;
     4         int n = board.size();
     5         for(int i = 0; i < n; i++){
     6             for(int j = 0; j < n; j ++) {
     7                 if(board[i][j] == '.'){
     8                     static const int arr[] = {1,2,3,4,5,6,7,8,9};
     9                     vector<int> digits(arr, arr + sizeof(arr) / sizeof(arr[0]));
    10                     //check row
    11                     for(int k = 0; k < n; k ++){
    12                         if(board[i][k] != '.')
    13                             digits[board[i][k] - 48 - 1] = -1;
    14                     }
    15                     //check column
    16                     for(int k = 0; k < n; k ++){
    17                         if(board[k][j] != '.')
    18                             digits[board[k][j] - 48 - 1] = -1;
    19                     }
    20                     //check the 9 sub-box
    21                     int row_box_idx = i/3;
    22                     int column_box_idx = j/3;
    23                     for(int l = row_box_idx * 3; l < (row_box_idx + 1) * 3; l ++){
    24                         if(l == i)
    25                             continue;
    26                         for(int m = column_box_idx * 3; m < (column_box_idx + 1) * 3; m ++){
    27                             if(board[l][m] != '.' && m != j)
    28                                 digits[board[l][m] - 48 - 1] = -1;
    29                         }
    30                     }
    31                     //caculate candidate number
    32                     int tmp_num = 0;
    33                     for(int candidate: digits)
    34                         if(candidate != -1) 
    35                             tmp_num ++;
    36     
    37                     if(tmp_num == 0){
    38                         if(idx.size() == 0){
    39                             idx.push_back(-1);
    40                             idx.push_back(-1);
    41                         }else {
    42                             idx[0] = -1;
    43                             idx[1] = -1;
    44                         }
    45                         return idx;
    46                     }
    47     
    48                     if(tmp_num < candidate_num){
    49                         candidate_num = tmp_num;
    50                         out_digits = digits;
    51                         if(idx.size() == 0){
    52                             idx.push_back(i);
    53                             idx.push_back(j);
    54                         }else {
    55                             idx[0] = i;
    56                             idx[1] = j;
    57                         }
    58                     }
    59                 }
    60             }
    61         }
    62         return idx;
    63     }
    64 
    65     bool isValidSudoku(vector<vector<char> > &board) {
    66         //find the candidate which has most constrict
    67         vector<int> digits;
    68         vector<int> idx = findLeastCandidate(board, digits);
    69         if(idx.size() == 0)
    70             return true;
    71     
    72         if(idx[0] == -1)
    73             return false;
    74     
    75         int i = idx[0];
    76         int j = idx[1];
    77         //recursive
    78         bool is_all_minus = true;
    79         for(int candidate: digits) {
    80             if(candidate != -1) {
    81                 is_all_minus = false;
    82                 board[i][j] = candidate + 48;
    83                 if(isValidSudoku(board))
    84                     return true;
    85                 else 
    86                     board[i][j] = '.';
    87             }
    88         }
    89         if(is_all_minus)
    90             return false;
    91         return false;
    92     }
    93     
    94     void solveSudoku(vector<vector<char> > &board) {
    95         isValidSudoku(board);
    96     }
  • 相关阅读:
    Javascript的实例化与继承:请停止使用new关键字
    关于Unicode和URL encoding入门的一切以及注意事项
    Javascript: 从prototype漫谈到继承(2)
    你真的了解setTimeout和setInterval吗?
    javascript同步分页
    jquery ui dialog去除第一个文本框焦点问题
    指定范围内的随机数
    Mac下的mysql初始密码如何重置?
    进度条插件
    浏览器事件以及事件代理
  • 原文地址:https://www.cnblogs.com/guyufei/p/3412263.html
Copyright © 2011-2022 走看看