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

    A sudoku puzzle...


    ...and its solution numbers marked in red.

    class Solution {
    public:
        void solveSudoku(vector<vector<char>>& board) {
            vector<vector<int>> used1(9,vector<int>(9,0)),used2(9,vector<int>(9,0)),used3(9,vector<int>(9,0));
                fillnum(used1,used2,used3,board);
                solve(used1,used2,used3,board);  
        }
         
        void fillnum(vector<vector<int>> &used1,vector<vector<int>> &used2,vector<vector<int>> &used3,vector<vector<char> > &board) {
            for(int i=0;i<board.size();i++)
                for(int j=0;j<board[0].size();j++)
                if(board[i][j]!='.')
                {
                    int num=board[i][j]-'0'-1;
                    int k=i/3*3+j/3;
                        used1[i][num]=used2[j][num]=used3[k][num]=1;
                }
        }
          
        bool solve(vector<vector<int>> &used1,vector<vector<int>> &used2,vector<vector<int>> &used3,vector<vector<char>>&board){
           for(int i=0;i<board.size();i++)
                for(int j=0;j<board[0].size();j++){
                    int k=i/3*3+j/3;
                    if(board[i][j]=='.'){
                        for(int fill=1;fill<10;fill++){
                            if(used1[i][fill-1]==0 && used2[j][fill-1]==0 && used3[k][fill-1]==0){
                            board[i][j]=fill+'0';
                            used1[i][fill-1]=used2[j][fill-1]=used3[k][fill-1]=1;
                            if(solve(used1,used2,used3,board))
                                return true;                            
                            board[i][j]='.';
                            used1[i][fill-1]=used2[j][fill-1]=used3[k][fill-1]=0;
                            }                        
                    }   
                        return false;
                    }            
                }
            return true;
        }
    };
  • 相关阅读:
    ASP.NET多线程下使用HttpContext.Current为null解决方案
    Pig性能优化
    重温设计模式之前言
    MVC4+WebApi+Redis Session共享练习(下)
    C#中对象的输出
    CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
    java版微信公众平台自定义菜单创建代码实现
    android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加
    VMware 11安装Mac OS X 10.10 及安装Mac Vmware Tools(超详细),以及动态调整虚拟机硬盘大小
    三个API:开启、关闭、关闭线程重定向
  • 原文地址:https://www.cnblogs.com/hrnn/p/13415273.html
Copyright © 2011-2022 走看看