https://oj.leetcode.com/problems/sudoku-solver/

九宫格数独问题。

一行上为1 2 3 到9

一列上为1 2 3 到9

每个小的3*3格子为 1 2 3 到9

使用深搜递归实现:

在技巧上,使用类的成员变量 vector<vector<char> > board; 这样不用每层递归都传递这个棋盘了

使用类的成员变量 bool flagOK; 标志是否已找到 solution.

从(0,0)位置开始递归,一个个位置加,直到位置到了最后一个。

在每一层上,遍历1 2 3 到 9 ,看看哪个数可以往这里放,然后递归下一层,即下一个位置。

当从下一个位置返回的时候,要把之前设置的值再 恢复 回来

还有个情况会导致返回到上一次,那就是从1 到 9 都遍历完了,仍然都不可以,也要记得恢复回来

class Solution {
public:
vector<vector<char> > board;
bool flagOK;
void solveSudoku(vector<vector<char> > &board) {
if(board.empty())
return;
flagOK = false;
this->board = board;
subSudoku(,);
board = this->board;
} // in rows and cols don't have the same one
bool valide(char num, int p, int q)
{
bool flag = true;
for(int i = ; i < board.size(); i++)
{
if(num == board[i][q])
{
flag = false;
break;
}
}
if(flag)
{
for(int j = ; j < board.size(); j++)
{
if(num == board[p][j])
{
flag = false;
break;
}
}
}
return flag;
} void subSudoku(int i, int j)
{
// till end find solution
if(i == board.size())
{
flagOK = true;
return;
} // num placed
if(board[i][j] != '.')
{
if(j < board.size() - )
{
subSudoku(i,j + );
if(flagOK == true)
return; //不再递归了,已经找到答案了
}
else
{
subSudoku(i+,);
if(flagOK == true)
return;
}
}
else
{
char num;
for(num = ''; num <= ''; num++)
{
// in its small cube
bool OKSmallCube = true;
int smallCubeI = i/;
int smallCubeJ = j/;
// check small cube
for(int s = ; s < ; s++)
{
for(int m = ; m < ; m++)
{
if(board[smallCubeI* + s][smallCubeJ* + m] == num)
{
OKSmallCube = false;
break;
}
}
if(OKSmallCube == false)
break;
} if(OKSmallCube && valide(num,i,j))
{
board[i][j] = num;
if(j < board.size() - )
{
subSudoku(i,j + );
if(flagOK == true)
return;
}
else
{
subSudoku(i+,);
if(flagOK == true)
return;
}
}
board[i][j] = '.'; //注意恢复原样
}
board[i][j] = '.';//注意恢复原样
}
}
};

LeetCode OJ-- Sudoku Solver ***的更多相关文章

  1. 【leetcode】Sudoku Solver

    Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...

  2. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  3. LeetCode 037 Sudoku Solver

    题目要求:Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells ...

  4. [LeetCode] 37. Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  5. Java for LeetCode 037 Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  6. Java [leetcode 37]Sudoku Solver

    题目描述: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...

  7. [leetcode]37. Sudoku Solver 解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  8. LeetCode 37 Sudoku Solver(求解数独)

    题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description   Problem : 解决数独问题,给出一个二维数组,将这个数独 ...

  9. LeetCode 36 Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  10. [leetcode 37]sudoku solver

    1 题目: 根据给出的数独,全部填出来 2 思路: 为了做出来,我自己人工做了一遍题目给的数独.思路是看要填的数字横.竖.子是否已经有1-9的数字,有就剔除一个,最后剩下一个的话,就填上.一遍一遍的循 ...

随机推荐

  1. Gym - 101981D Country Meow(模拟退火)

    题意 三维空间有\(n\)个点,找到另外一个点,离所有点的最大距离最小.求这个距离. 题解 \(1\).最小球覆盖,要找的点为球心. \(2\).模拟退火. 还是补一下模拟退火的介绍吧. 模拟退火有一 ...

  2. 最近使用Nginx的一点新得

    1.基本的负载配置 Nginx最简单的配置模块如下 upstream name{ server ip:port; server ip:port; } server { listen 80; serve ...

  3. getsupportfragmentmanager 没有这个方法

    让activity继承自fragmentactivity就行了.

  4. loj2090 「ZJOI2016」旅行者

    分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...

  5. Python数据分析基础——读写CSV文件

    1.基础python代码: #!/usr/bin/env python3 # 可以使脚本在不同的操作系统之间具有可移植性 import sys # 导入python的内置sys模块,使得在命令行中向脚 ...

  6. [oldboy-django][2深入django]FBV + CBV + 装饰器

    FBV django CBV & FBV - FBV function basic view a. urls 设置 urls(r'^test.html$', views.test) b. vi ...

  7. Nginx概述与安装

    什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...

  8. i++ 和++i 的理解 以防面试

    根本原理: //模拟 a++ function afterAdd(){ var temp = a; a = a+1; return temp; } //模拟++a; function beforeAd ...

  9. 【Luogu】P4172水管局长(LCT)

    题目链接 有个结论是x到y的路径上最长边权值等于最小生成树上最长边权值,于是问题转化为最小生成树. 再考虑把问题反过来,删边变成加边. 于是变成动态维护最小生成树,LCT可以做到. #include& ...

  10. EPPlus(SQL导成Excel)

    使用Epplus方法把sql数据库中表的数据导出到excel中去: 需要使用EPPlus.dll引用. using System.IO; using OfficeOpenXml; public sta ...