leetcode 37. Sudoku Solver

最近在刷leetcode,遇到这道数独的题目,发现自己原来写过数独的题目,不过回头看看自己当初写的代码,写得简直了......

之前的写的博客:https://blog.csdn.net/lovemylife1234/article/details/72026690

就趁这个机会重写了一遍,依旧是dfs搜索,使用了map来进行快速判断

37. Sudoku Solver

Hard

60441

Write a program to solve a Sudoku puzzle by filling the empty cells.

A sudoku solution must satisfy all of the following rules:

  1. Each of the digits 1-9 must occur exactly once in each row.
  2. Each of the digits 1-9 must occur exactly once in each column.
  3. Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.

Empty cells are indicated by the character '.'.


A sudoku puzzle...


...and its solution numbers marked in red.

Note:

  • The given board contain only digits 1-9 and the character '.'.
  • You may assume that the given Sudoku puzzle will have a single unique solution.
  • The given board size is always 9x9.

 

代码:

class Solution {
public:
    map<int,bool> mp_row[9],mp_col[9],mp_9[3][3];
    bool ok=false;
    void init(vector<vector<char>>& bd){
        for(int i=0;i<9;++i){
            for(int j=1;j<=9;++j){
                mp_row[i][j]=false;
                mp_col[i][j]=false;
            }
            
        }
        for(int i=0;i<3;++i){
            for(int j=0;j<3;++j){
                for(int k=1;k<=9;++k){
                    mp_9[i][j][k]=false;
                }
            }
        }
        int tmp;
        for(int i=0;i<9;++i){
            for(int j=0;j<9;++j){
                if(bd[i][j]!='.'){
                    tmp=(int)(bd[i][j]-'0');
                    mp_row[i][tmp]=true;
                    mp_col[j][tmp]=true;
                    mp_9[i/3][j/3][tmp]=true;
                }
            }
        }
    }
    
    void dfs(vector<vector<char>>& bd,int m,int n){
        if(ok) return;
        if(m==8&&n==9){
            ok=true;
            // for(int i=0;i<9;++i){
            //     for(int j=0;j<9;++j){
            //         cout<<bd[i][j]<<" ";
            //     }
            //     cout<<endl;
            // }
            return;
        }
        if(n==9){
            dfs(bd,m+1,0);
            return;
        }
        if(bd[m][n]=='.'){
            for(int i=9;i>=1;--i){
                if(!mp_row[m][i]&&!mp_col[n][i]&&!mp_9[m/3][n/3][i]){
                    mp_row[m][i]=true;
                    mp_col[n][i]=true;
                    mp_9[m/3][n/3][i]=true;

                    bd[m][n]=(char)(i+'0');
                    dfs(bd,m,n+1);
                    if(ok) return;
                    bd[m][n]='.';

                    mp_row[m][i]=false;
                    mp_col[n][i]=false;
                    mp_9[m/3][n/3][i]=false;
                }
            }               
        }else{
            dfs(bd,m,n+1);
        }
    }
    
    void solveSudoku(vector<vector<char>>& board) {
        init(board);
        // for(int i=1;i<=9;++i){
        //     cout<<(mp_9[2][2][i]==true?i:-1)<<endl;
        // }
        dfs(board,0,0);
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值