zoukankan      html  css  js  c++  java
  • LeetCode 37. 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.

    image

    A sudoku puzzle...

    image

    ...and its solution numbers marked in red.

    大意就是给你一个不完成的数独, 让你填完整。

    直接dfs, 用三个数组记录行,列, 块就可以了

    class Solution {
        bool dfs(vector<vector<char>>& board, bool row[10][10], bool val[10][10], bool rtl[10][10], int x, int y)
        {
            while(x < 9 && y < 9 && board[x][y] != '.')
            {
                y ++;
                if(y == 9)
                    x ++, y = 0;
            }
            
            if(x >= 9)
                return true;
            
            for(int i=1; i<10; ++ i)
            {
                if(row[x][i] == false &&  val[y][i] == false &&  rtl[x/3*3+y/3][i] == false)
                {
                    board[x][y] = '0' + i;
                    row[x][i] = val[y][i] = rtl[x/3*3+y/3][i] = true;
                    
                    if(dfs(board, row, val, rtl, x + (y+1 == 9), (y+1==9) ? 0 : y + 1))
                        return true;
                    
                    row[x][i] = val[y][i] = rtl[x/3*3+y/3][i] = false;
                }
            }
            board[x][y] = '.';
            return false;
        }
    public:
        void solveSudoku(vector<vector<char>>& board) {
            
            bool row[10][10], val[10][10], rtl[10][10];
            memset(row, false, sizeof(row));
            memset(val, false, sizeof(val));
            memset(rtl, false, sizeof(rtl));
            
            for(int i = 0; i < 9; ++ i)
            {
                for(int j = 0; j < 9; ++ j)
                {
                    if(board[i][j] == '.')
                        continue;
                    int t = board[i][j] - '0';
                    if(row[i][t] || val[j][t] || rtl[i / 3 * 3 + j / 3][t])
                        continue;
                    row[i][t] = val[j][t] = rtl[i / 3 * 3 + j / 3][t] = true;
                }
            }
            
            dfs(board, row, val, rtl, 0, 0);
        }
    };
    
  • 相关阅读:
    apply 无循环拼接数组
    匿名函数自调的三种方法
    移动元素时,translate要比margin好
    Tesseract库原理分析
    [转]基于OCR的图片字符识别可行性研究
    [转]C&C++图形图像处理开源库
    [转]OCR识别的开源分析
    [转]众多OCR软件
    [转]常用OCR软件介绍
    [转]浅谈OCR之Tesseract
  • 原文地址:https://www.cnblogs.com/aiterator/p/6598047.html
Copyright © 2011-2022 走看看