Valid Sudoku&&Sudoku Solver
Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
暴力解法,一行一行的看,一列一列的看,一个一个方格的看,
代码如下:
- class Solution {
- public:
- bool isValidCell(vector<vector<char> > &board, int a, int b) {
- vector<bool> flag(, false);
- int idx;
- for (int i = ; i < ; ++i) {
- for (int j = ; j < ; ++j) {
- idx = board[a + i][b + j] - '';
- if (idx > && idx <= && !flag[idx])
- flag[idx] = true;
- else if (idx > && idx <= && flag[idx])
- return false;
- }
- }
- return true;
- }
- bool isValidRow(vector<vector<char> > &board, int a) {
- vector<bool> flag(, false);
- int idx;
- for (int j = ; j < ; ++j) {
- idx = board[a][j] - '';
- if (idx > && idx <= && !flag[idx])
- flag[idx] = true;
- else if (idx > && idx <= && flag[idx])
- return false;
- }
- return true;
- }
- bool isValidCol(vector<vector<char> > &board, int b) {
- vector<bool> flag(, false);
- int idx;
- for (int i = ; i < ; ++i) {
- idx = board[i][b] - '';
- if (idx > && idx <= && !flag[idx])
- flag[idx] = true;
- else if (idx > && idx <= && flag[idx])
- return false;
- }
- return true;
- }
- bool isValidSudoku(vector<vector<char> > &board) {
- for (int i = ; i < ; ++i) {
- for (int j = ; j < ; ++j) {
- if (!isValidCell(board, * i, * j))
- return false;
- }
- }
- for (int i = ; i < ; ++i) {
- if (!isValidRow(board, i))
- return false;
- }
- for (int j = ; j < ; ++j) {
- if (!isValidCol(board, j))
- return false;
- }
- return true;
- }
- };
一种简介的解法(还没认真看,可能牵扯到一些数学):
- class Solution {
- public:
- bool isValidSudoku(vector<vector<char> > &board) {
- vector<vector<bool>> rows(, vector<bool>(,false));
- vector<vector<bool>> cols(, vector<bool>(,false));
- vector<vector<bool>> blocks(, vector<bool>(,false));
- for(int i = ; i < ; i++)
- for(int j = ; j < ; j++)
- {
- if(board[i][j] == '.')continue;
- int num = board[i][j] - '';
- if(rows[i][num] || cols[j][num] || blocks[i - i% + j/][num])
- return false;
- rows[i][num] = cols[j][num] = blocks[i - i% + j/][num] = true;
- }
- return true;
- }
- };
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.
很多题乍一看很难,是因为思路不清晰,只要思路清晰了,还是很简单的。
思路:
首先,每一行每一列的数字不能重合,其次把81个格子分成9个小格子,每一个格子里面的数字不能重合。
转:http://www.cnblogs.com/ganganloveu/p/3828401.html
这题跟N-Queens是一个套路,回溯法尝试所有解。
需要注意的区别是:
本题找到解的处理是return true,因此返回值为bool
N-Queen找到解的处理是保存解,因此返回值为void
对于每个空位'.',遍历1~9,check合理之后往下一个位置递归。
由于这里路径尝试本质上是有序的,即1~9逐个尝试,因此无需额外设置状态位记录已经尝试过的方向。
注意:只有正确达到最终81位置(即成功填充)的填充结果才可以返回,若不然,将会得到错误的填充。
因此辅助函数solve需要设为bool而不是void
- class Solution {
- public:
- void solveSudoku(vector<vector<char> > &board) {
- solve(board, );
- }
- bool solve(vector<vector<char> > &board, int position)
- {
- if(position == )
- return true;
- int row = position / ;
- int col = position % ;
- if(board[row][col] == '.')
- {
- for(int i = ; i <= ; i ++)
- {//try each digit
- board[row][col] = i + '';
- if(check(board, position))
- if(solve(board, position + ))
- //only return valid filling
- return true;
- board[row][col] = '.';
- }
- }
- else
- {
- if(solve(board, position + ))
- //only return valid filling
- return true;
- }
- return false;
- }
- bool check(vector<vector<char> > &board, int position)
- {
- int row = position / ;
- int col = position % ;
- int gid;
- if(row >= && row <= )
- {
- if(col >= && col <= )
- gid = ;
- else if(col >= && col <= )
- gid = ;
- else
- gid = ;
- }
- else if(row >= && row <= )
- {
- if(col >= && col <= )
- gid = ;
- else if(col >= && col <= )
- gid = ;
- else
- gid = ;
- }
- else
- {
- if(col >= && col <= )
- gid = ;
- else if(col >= && col <= )
- gid = ;
- else
- gid = ;
- }
- //check row, col, subgrid
- for(int i = ; i < ; i ++)
- {
- //check row
- if(i != col && board[row][i] == board[row][col])
- return false;
- //check col
- if(i != row && board[i][col] == board[row][col])
- return false;
- //check subgrid
- int r = gid/*+i/;
- int c = gid%*+i%;
- if((r != row || c != col) && board[r][c] == board[row][col])
- return false;
- }
- return true;
- }
- };
Valid Sudoku&&Sudoku Solver的更多相关文章
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...
- leetcode@ [36/37] Valid Sudoku / Sudoku Solver
https://leetcode.com/problems/valid-sudoku/ Determine if a Sudoku is valid, according to: Sudoku Puz ...
- Leetcode | Valid Sudoku & Sudoku Solver
判断valid,没有更好的方法,只能brute force. class Solution { public: bool isValidSudoku(vector<vector<char& ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- LeetCode:36. Valid Sudoku,数独是否有效
LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...
- [LeetCode] 36. Valid Sudoku 验证数独
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
- Lintcode389 Valid Sudoku solution 题解
[题目描述] Determine whether a Sudoku is valid. The Sudoku board could be partially filled, where empty ...
- [Swift]LeetCode36. 有效的数独 | Valid Sudoku
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
- 36. Valid Sudoku 判断九九有效的数独
[抄题]: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according ...
随机推荐
- mysql四-2:多表查询
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...
- 用Visual C#开发基于OpenCV的Windows应用程序
http://blog.163.com/wangxh_jy/blog/static/28233883201001581640283/ 关于详细的配置及程序运行截图,请下载:http://downloa ...
- Nginx报错 nginx: [error] open() "/usr/local/nginx-1.6.3/logs/nginx.pid" failed (2: No such file or directory)
问题: 解决: http://www.jianshu.com/p/918eb337a206 dd
- std::sort运行出core(segment fault)
http://note.youdao.com/noteshare?id=6aae09345e85ab55fe24ac959118a747
- MySQL查询和修改auto_increment的方法
查询表名为tableName的auto_increment值: 复制代码 代码如下: SELECT AUTO_INCREMENT FROM information_schema.tables WHER ...
- [DeeplearningAI笔记]卷积神经网络4.1-4.5 人脸识别/one-shot learning/Siamase网络/Triplet损失/将面部识别转化为二分类问题
4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.1什么是人脸识别 Face verification人脸验证 VS face recogniti ...
- Android 加载网络图片设置到ImageView
下载图片后显示在ImageView中 //1.定义全局变量 private Handler handler; private String image_url; private Bitmap bitm ...
- Scrapy的安装--------Windows、linux、mac等操作平台
Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或者是Python3.3版本及以上.下面来说py3环境下,scrapy的安装过程. Scrapy依赖的库比较多,至少需 ...
- 最短路+找规律 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest L. Right Build
题目链接:http://codeforces.com/gym/101149/problem/L 题目大意:有n个点(其实是n+1个点,因为编号是0~n),m条有向边.起点是0,到a和b两个节点,所经过 ...
- LightOJ 1065 - Number Sequence 矩阵快速幂水题
http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...