• LeetCode


    37. Sudoku Solver 

    Problem's Link

     ----------------------------------------------------------------------------

    Mean: 

    求解数独.

    analyse:

    只是9宫格的数独,而且测试数据都不难,所以可以直接使用递归求解,类似于N-Queue问题.

    但如果宫格数较多,则需要使用Dancing-Link精确覆盖算法来求解.

    Time complexity: O(N)

     

    view code

    /**
    * -----------------------------------------------------------------
    * Copyright (c) 2016 crazyacking.All rights reserved.
    * -----------------------------------------------------------------
    *       Author: crazyacking
    *       Date  : 2016-03-02-18.53
    */
    #include <queue>
    #include <cstdio>
    #include <set>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <climits>
    #include <map>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #include <bits/stdc++.h>
    #include <windows.h>
    using namespace std;
    typedef long long(LL);
    typedef unsigned long long(ULL);
    const double eps(1e-8);

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

       bool recursiveSolve(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]=static_cast<char>(k+'0');
                           if(isValid(board,i,j) && recursiveSolve(board))
                               return true;
                           board[i][j]='.';
                       }
                       return false;
                   }
               }
           }
           return true;
       }

       bool isValid(const vector<vector<char>>& board,const int r1,const int c1)const
       {
           for(int i=0;i<9;++i)
           {
               if(i!=r1 && board[i][c1]==board[r1][c1])
                   return false;
               if(i!=c1 && board[r1][i]==board[r1][c1])
                   return false;
           }
           int rowBegin=r1/3*3;
           int colBegin=c1/3*3;
           for(int i=rowBegin;i<rowBegin+3;++i)
           {
               for(int j=colBegin;j<colBegin+3;++j)
               {
                   if(i!=r1 && j!=c1 && board[i][j]==board[r1][c1])
                       return false;
               }
           }
           return true;
       }
    };


    int main()
    {
       freopen("H:\Code_Fantasy\in.txt","r",stdin);
       Solution solution;
       vector<vector<char>> ve;
       string s;
       while(cin>>s)
       {
           vector<char> tempVe;
           for(int i=0;i<s.length();++i)
               tempVe.push_back(s[i]);
           ve.push_back(tempVe);
       }
       solution.solveSudoku(ve);
       return 0;
    }
    /*

    */
  • 相关阅读:
    mongodb删除指定字段
    nodejs地理坐标转换
    浅谈对腾讯云微信小程序解决方案服务端的理解(主要针对信道服务)
    利用Django进行微信支付接口的开发
    SpringBoot常用注解
    构建一个敏感词字典树
    Java异常统一处理
    [一天一个小知识]instanceof
    [总结]实现表格中对checkbox的操作
    小程序的数据绑定
  • 原文地址:https://www.cnblogs.com/crazyacking/p/5238074.html
Copyright © 2020-2023  润新知