LeetCode OJ-- Sudoku Solver ***
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 ***的更多相关文章
- 【leetcode】Sudoku Solver
Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...
- LeetCode 037 Sudoku Solver
题目要求:Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells ...
- [LeetCode] 37. Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- 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 ...
- Java [leetcode 37]Sudoku Solver
题目描述: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...
- [leetcode]37. Sudoku Solver 解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- LeetCode 37 Sudoku Solver(求解数独)
题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description Problem : 解决数独问题,给出一个二维数组,将这个数独 ...
- LeetCode 36 Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- [leetcode 37]sudoku solver
1 题目: 根据给出的数独,全部填出来 2 思路: 为了做出来,我自己人工做了一遍题目给的数独.思路是看要填的数字横.竖.子是否已经有1-9的数字,有就剔除一个,最后剩下一个的话,就填上.一遍一遍的循 ...
随机推荐
- Gym - 101981D Country Meow(模拟退火)
题意 三维空间有\(n\)个点,找到另外一个点,离所有点的最大距离最小.求这个距离. 题解 \(1\).最小球覆盖,要找的点为球心. \(2\).模拟退火. 还是补一下模拟退火的介绍吧. 模拟退火有一 ...
- 最近使用Nginx的一点新得
1.基本的负载配置 Nginx最简单的配置模块如下 upstream name{ server ip:port; server ip:port; } server { listen 80; serve ...
- getsupportfragmentmanager 没有这个方法
让activity继承自fragmentactivity就行了.
- loj2090 「ZJOI2016」旅行者
分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...
- Python数据分析基础——读写CSV文件
1.基础python代码: #!/usr/bin/env python3 # 可以使脚本在不同的操作系统之间具有可移植性 import sys # 导入python的内置sys模块,使得在命令行中向脚 ...
- [oldboy-django][2深入django]FBV + CBV + 装饰器
FBV django CBV & FBV - FBV function basic view a. urls 设置 urls(r'^test.html$', views.test) b. vi ...
- Nginx概述与安装
什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...
- i++ 和++i 的理解 以防面试
根本原理: //模拟 a++ function afterAdd(){ var temp = a; a = a+1; return temp; } //模拟++a; function beforeAd ...
- 【Luogu】P4172水管局长(LCT)
题目链接 有个结论是x到y的路径上最长边权值等于最小生成树上最长边权值,于是问题转化为最小生成树. 再考虑把问题反过来,删边变成加边. 于是变成动态维护最小生成树,LCT可以做到. #include& ...
- EPPlus(SQL导成Excel)
使用Epplus方法把sql数据库中表的数据导出到excel中去: 需要使用EPPlus.dll引用. using System.IO; using OfficeOpenXml; public sta ...