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. C++构造函数使用的多种方法

    // classes and uniform initialization #include <iostream> using namespace std; class Circle { ...

  2. ACM二分搜索中的最大化最小值 总结

    这类题目都有个相似的地方就是需要你去找一个临界点. 分析题目要你求什么,例如时间 那么mid就是时间 看求得这个跟什么相关 例如 poj 3258 求得是距离 这个距离跟两者之间的差相关 那题目要求你 ...

  3. LeetCode刷题感想

    断断续续用了半年的时间把LeetCode刷完了,之前复习了数据结构与算法.将刷题与复习数据结构结合起来会更有效果.总之不是为了刷题而刷题,而是为了巩固和补充一部分知识. LeetCode真的是一个很好 ...

  4. 笔记-python-内存管理

    笔记-python-内存管理 1.      内存使用 1.1.    对象的内存使用 a = 1 1是一个对象,a是引用,指向1. >>> id(a) 1951821280 这个数 ...

  5. Java程序占用实际内存大小

    很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存.堆只是影响Java程序占用内存数量的一个因素.要更好的理解你的J ...

  6. OpenCV学习笔记(七) 图像金字塔 阈值 边界

    转自: OpenCV 教程 使用 图像金字塔 进行缩放 图像金字塔是视觉运用中广泛采用的一项技术.一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到 ...

  7. laravel5.2总结--序列化

    序列化 构建Json格式的API接口时,经常需要转换 '模型' 和 '关联关系' 为数组或者JSON. 1>转换模型为数组:   $user = App\User::with('roles')- ...

  8. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  9. psql 工具详细使用介绍

    psql 介绍 psql 是 PostgreSQL 中的一个命令行交互式客户端工具, 它允许你交互地键入 SQL 命令,然后把它们发送给 PostgreSQL 服务器,再显示 SQL 或命令的结果. ...

  10. [python][django 1.10中文文档]

    https://docs.djangoproject.com/en/1.10/  官方文档,点我下载 推荐一个翻译django 1.8.2的网址: 推荐一个翻译django 1.10的博客:(着重推荐 ...