main.cc 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * @lc app=leetcode.cn id=37 lang=cpp
  3. *
  4. * [37] 解数独
  5. */
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8. // @lc code=start
  9. void print(const vector<vector<char>>& board) {
  10. for (int i = 0; i < 9; ++i) {
  11. for (int j = 0; j < 9; ++j) {
  12. cout << board[i][j] << ",";
  13. }
  14. cout << endl;
  15. }
  16. }
  17. class Solution {
  18. public:
  19. void solveSudoku(vector<vector<char>>& board) {
  20. vector<pair<int, int>> empty;
  21. for (int i = 0; i < 9; ++i) {
  22. for (int j = 0; j < 9; ++j) {
  23. if (board[i][j] == '.') {
  24. empty.emplace_back(i, j);
  25. }
  26. }
  27. }
  28. int n = empty.size();
  29. function<bool(int, int)> vaild = [&](int i, int j) -> bool {
  30. array<int, 9> exist1 = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  31. array<int, 9> exist2 = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  32. array<int, 9> exist3 = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  33. for (int k = 0; k < 9; ++k) {
  34. if (board[i][k] != '.') {
  35. if (exist1[board[i][k] - '1']) {
  36. return false;
  37. }
  38. exist1[board[i][k] - '1'] = 1;
  39. }
  40. if (board[k][j] != '.') {
  41. if (exist2[board[k][j] - '1']) {
  42. return false;
  43. }
  44. exist2[board[k][j] - '1'] = 1;
  45. }
  46. }
  47. int r = i / 3 * 3;
  48. int c = j / 3 * 3;
  49. for (int k = 0; k < 3; ++k) {
  50. for (int l = 0; l < 3; ++l) {
  51. if (board[r + k][c + l] != '.') {
  52. if (exist3[board[r + k][c + l] - '1']) {
  53. return false;
  54. }
  55. exist3[board[r + k][c + l] - '1'] = 1;
  56. }
  57. }
  58. }
  59. return true;
  60. };
  61. function<void(int)> f = [&](int i) {
  62. if (i == n) {
  63. throw exception();
  64. }
  65. for (int j = 0; j < 9; ++j) {
  66. board[empty[i].first][empty[i].second] = j + '1';
  67. if (vaild(empty[i].first, empty[i].second)) {
  68. f(i + 1);
  69. }
  70. board[empty[i].first][empty[i].second] = '.';
  71. }
  72. };
  73. try {
  74. f(0);
  75. } catch (const exception& e) {
  76. }
  77. // cant be solved
  78. }
  79. };
  80. // @lc code=end
  81. int main() {
  82. Solution s;
  83. vector<vector<char>> b = {{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
  84. {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
  85. {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
  86. {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
  87. {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
  88. {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
  89. {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
  90. {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
  91. {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};
  92. s.solveSudoku(b);
  93. print(b);
  94. }