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 ...
随机推荐
- 使用Ajax内容签名,减少流量浪费
前端UI界面用Ajax获取数据内容的时候,一般是直接获取内容数据并填充,不管内容有无变化,不管数据量多大,都是直接重新加载数据,例如定时刷新公告等. 今天在浏览器控制台调试的时候,发现动态刷新内容,其 ...
- hadoop(三)HDFS基础使用
一.HDFS前言 1. 设计思想 分而治之:将大文件,大批量文件,分布式的存放于大量服务器上.以便于采取分而治之的方式对海量数据进行运算分析 2. 在大数据系统架构中的应用 ...
- [POI2005]Bank notes
link 试题分析 我们发现此题是一个十分简单的多重背包.但是按照朴素写法会超时.所以要去考虑优化. 我们发现我们若$W=7$,可以拆成$1+2+4$,不用每次$1+1+1+1+1+1+1$,从$N$ ...
- cin/cout与scanf/printf的比较
转自http://www.cnblogs.com/penelope/articles/2426577.html cin .cout 基本说明: cin是标准输入流对象,代表标准输入设备(键盘), ...
- CollectionUtils.isEqualCollection的用法
在使用Java的集合时,有些时候会需要比较两个集合是否相等,自己写方法其实也简单,但是既然有了好的实现,就不要自己造轮子了,只要了解这个轮子是什么原理就好了. public static boolea ...
- Tomcat不能启动注意事项
Server.xml中的<Context></Context>不能有相同的两个或多个,把相同的只能保留一个
- 【Java】将字符串转化为整数
前几天面试遇到这个问题:在Java中如何将字符串转化为整数,当时too young too naive,随便回答了一下.今天跑去看Java源码中paresInt函数的写法,Oh my god!其实不看 ...
- 改变你一生的编辑器:VSCode使用总结
开发十年,只剩下这套Java开发体系了 >>> 前言:vscode是微软出品的,基于Electron和TypeScript的,现在已经是最火的一款文本编辑器.我认为vscode是 ...
- Redis数据类型之散列(hash)
1. 什么是散列 散列类似于一个字典,是一个<K, V>对的集合,不过这个key和value都只能是字符串类型的,不能嵌套,可以看做Java中的Map<String, String& ...
- lintcode 66.67.68 二叉树遍历(前序、中序、后序)
AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode le ...