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.

暴力解法,一行一行的看,一列一列的看,一个一个方格的看,

代码如下:

  1. class Solution {
  2. public:
  3. bool isValidCell(vector<vector<char> > &board, int a, int b) {
  4. vector<bool> flag(, false);
  5. int idx;
  6. for (int i = ; i < ; ++i) {
  7. for (int j = ; j < ; ++j) {
  8. idx = board[a + i][b + j] - '';
  9. if (idx > && idx <= && !flag[idx])
  10. flag[idx] = true;
  11. else if (idx > && idx <= && flag[idx])
  12. return false;
  13. }
  14. }
  15. return true;
  16. }
  17.  
  18. bool isValidRow(vector<vector<char> > &board, int a) {
  19. vector<bool> flag(, false);
  20. int idx;
  21. for (int j = ; j < ; ++j) {
  22. idx = board[a][j] - '';
  23. if (idx > && idx <= && !flag[idx])
  24. flag[idx] = true;
  25. else if (idx > && idx <= && flag[idx])
  26. return false;
  27. }
  28. return true;
  29. }
  30.  
  31. bool isValidCol(vector<vector<char> > &board, int b) {
  32. vector<bool> flag(, false);
  33. int idx;
  34. for (int i = ; i < ; ++i) {
  35. idx = board[i][b] - '';
  36. if (idx > && idx <= && !flag[idx])
  37. flag[idx] = true;
  38. else if (idx > && idx <= && flag[idx])
  39. return false;
  40. }
  41. return true;
  42. }
  43.  
  44. bool isValidSudoku(vector<vector<char> > &board) {
  45. for (int i = ; i < ; ++i) {
  46. for (int j = ; j < ; ++j) {
  47. if (!isValidCell(board, * i, * j))
  48. return false;
  49. }
  50. }
  51. for (int i = ; i < ; ++i) {
  52. if (!isValidRow(board, i))
  53. return false;
  54. }
  55. for (int j = ; j < ; ++j) {
  56. if (!isValidCol(board, j))
  57. return false;
  58. }
  59. return true;
  60. }
  61. };

一种简介的解法(还没认真看,可能牵扯到一些数学):

  1. class Solution {
  2. public:
  3. bool isValidSudoku(vector<vector<char> > &board) {
  4. vector<vector<bool>> rows(, vector<bool>(,false));
  5. vector<vector<bool>> cols(, vector<bool>(,false));
  6. vector<vector<bool>> blocks(, vector<bool>(,false));
  7.  
  8. for(int i = ; i < ; i++)
  9. for(int j = ; j < ; j++)
  10. {
  11. if(board[i][j] == '.')continue;
  12. int num = board[i][j] - '';
  13. if(rows[i][num] || cols[j][num] || blocks[i - i% + j/][num])
  14. return false;
  15. rows[i][num] = cols[j][num] = blocks[i - i% + j/][num] = true;
  16. }
  17. return true;
  18. }
  19. };

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

  1. class Solution {
  2. public:
  3. void solveSudoku(vector<vector<char> > &board) {
  4. solve(board, );
  5. }
  6. bool solve(vector<vector<char> > &board, int position)
  7. {
  8. if(position == )
  9. return true;
  10.  
  11. int row = position / ;
  12. int col = position % ;
  13. if(board[row][col] == '.')
  14. {
  15. for(int i = ; i <= ; i ++)
  16. {//try each digit
  17. board[row][col] = i + '';
  18. if(check(board, position))
  19. if(solve(board, position + ))
  20. //only return valid filling
  21. return true;
  22. board[row][col] = '.';
  23. }
  24. }
  25. else
  26. {
  27. if(solve(board, position + ))
  28. //only return valid filling
  29. return true;
  30. }
  31. return false;
  32. }
  33. bool check(vector<vector<char> > &board, int position)
  34. {
  35. int row = position / ;
  36. int col = position % ;
  37. int gid;
  38. if(row >= && row <= )
  39. {
  40. if(col >= && col <= )
  41. gid = ;
  42. else if(col >= && col <= )
  43. gid = ;
  44. else
  45. gid = ;
  46. }
  47. else if(row >= && row <= )
  48. {
  49. if(col >= && col <= )
  50. gid = ;
  51. else if(col >= && col <= )
  52. gid = ;
  53. else
  54. gid = ;
  55. }
  56. else
  57. {
  58. if(col >= && col <= )
  59. gid = ;
  60. else if(col >= && col <= )
  61. gid = ;
  62. else
  63. gid = ;
  64. }
  65.  
  66. //check row, col, subgrid
  67. for(int i = ; i < ; i ++)
  68. {
  69. //check row
  70. if(i != col && board[row][i] == board[row][col])
  71. return false;
  72.  
  73. //check col
  74. if(i != row && board[i][col] == board[row][col])
  75. return false;
  76.  
  77. //check subgrid
  78. int r = gid/*+i/;
  79. int c = gid%*+i%;
  80. if((r != row || c != col) && board[r][c] == board[row][col])
  81. return false;
  82. }
  83. return true;
  84. }
  85. };

  

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. mysql四-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...

  2. 用Visual C#开发基于OpenCV的Windows应用程序

    http://blog.163.com/wangxh_jy/blog/static/28233883201001581640283/ 关于详细的配置及程序运行截图,请下载:http://downloa ...

  3. 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

  4. std::sort运行出core(segment fault)

    http://note.youdao.com/noteshare?id=6aae09345e85ab55fe24ac959118a747

  5. MySQL查询和修改auto_increment的方法

    查询表名为tableName的auto_increment值: 复制代码 代码如下: SELECT AUTO_INCREMENT FROM information_schema.tables WHER ...

  6. [DeeplearningAI笔记]卷积神经网络4.1-4.5 人脸识别/one-shot learning/Siamase网络/Triplet损失/将面部识别转化为二分类问题

    4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.1什么是人脸识别 Face verification人脸验证 VS face recogniti ...

  7. Android 加载网络图片设置到ImageView

    下载图片后显示在ImageView中 //1.定义全局变量 private Handler handler; private String image_url; private Bitmap bitm ...

  8. Scrapy的安装--------Windows、linux、mac等操作平台

    Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或者是Python3.3版本及以上.下面来说py3环境下,scrapy的安装过程. Scrapy依赖的库比较多,至少需 ...

  9. 最短路+找规律 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两个节点,所经过 ...

  10. LightOJ 1065 - Number Sequence 矩阵快速幂水题

    http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...