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的更多相关文章

  1. LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  2. leetcode@ [36/37] Valid Sudoku / Sudoku Solver

    https://leetcode.com/problems/valid-sudoku/ Determine if a Sudoku is valid, according to: Sudoku Puz ...

  3. Leetcode | Valid Sudoku & Sudoku Solver

    判断valid,没有更好的方法,只能brute force. class Solution { public: bool isValidSudoku(vector<vector<char& ...

  4. [LeetCode] Valid Sudoku 验证数独

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  5. LeetCode:36. Valid Sudoku,数独是否有效

    LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...

  6. [LeetCode] 36. Valid Sudoku 验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  7. Lintcode389 Valid Sudoku solution 题解

    [题目描述] Determine whether a Sudoku is valid. The Sudoku board could be partially filled, where empty ...

  8. [Swift]LeetCode36. 有效的数独 | Valid Sudoku

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  9. 36. Valid Sudoku 判断九九有效的数独

    [抄题]: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according ...

随机推荐

  1. Codeforces 585E. Present for Vitalik the Philatelist(容斥)

    好题!学习了好多 写法①: 先求出gcd不为1的集合的数量,显然我们可以从大到小枚举计算每种gcd的方案(其实也是容斥),或者可以直接枚举gcd然后容斥(比如最大值是6就用2^cnt[2]-1+3^c ...

  2. dorado事件

    //----------------------------------------------------------------------------// //校验实体数据是否填写if(enti ...

  3. poj2115 C Looooops

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29262   Accepted: 8441 Descr ...

  4. 洛谷P3414 SAC#1 - 组合数

    P3414 SAC#1 - 组合数 218通过 681提交 题目提供者ProjectWTA 标签 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 讨论区出bug ...

  5. Servlet 介绍

    JSP 的本质就是 Servlet,开发者把编写好的 JSP 页面部署在 Web 容器中后,Web 容器会将 JSP 编译成对应的 Servlet. Servlet 的开发 Servlet 是个特殊的 ...

  6. laravel5.1 关联模型保存的方法(使用associate方法)

    模型定义 class User { public function customer() { return $this->hasOne('Customer'); } } class Custom ...

  7. Adreno GPU Profiler工具使用总结

    Adreno Profiler介绍 Adreno Profiler 是高通公司开发的一款针对运行在高通骁龙处理器上用于图形和GPGPU技术应用的性能分析和帧调试工具.工具本质上是一个OpenGL ES ...

  8. WPF系列之一:基于并行任务和MVVM创建响应灵敏和数据驱动的UI

    在利用WPF创建桌面应用程序的界面时,经常使用MVVM的设计模式,以减少UI层与逻辑层的代码耦合度. 在MVVM的设计中,最主要的方法和技术是UI中的控件利用Binding来和逻辑层(ViewMode ...

  9. 效应量Effect Size

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  10. 1.ideal常用快捷键

    Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...