Sudoku Solver解题报告
2015-04-07 20:40
323 查看
该题可以用回溯法求解,对当前位置(x, y),首先求出满足条件的数字作为候选C,对C中的每一个元素Ci, 令board[x][y] = Ci,进行到下一个位置(x’, y‘),判断是否满足,如果不满足,则令board[x][y]等于下一个候选,直到遍历完所有的候选值。步骤:
1、如果当前位置不为空,进行到下一个位置;否则,执行步骤2
2、分别求出当前位置(x, y)所在行、列和块中已经出现的数字,记为C,如此便可得知在当前位置可能会出现的值(即数字1~9中除了C中的值除外的那些值)
3、对C中的每一个值Ci
令board[x][y] = Ci;
行进到下一个位置,如果返回true,说明已找到正确的解,返回true;
否则,令board[x][y] = '.';
Code:
1、如果当前位置不为空,进行到下一个位置;否则,执行步骤2
2、分别求出当前位置(x, y)所在行、列和块中已经出现的数字,记为C,如此便可得知在当前位置可能会出现的值(即数字1~9中除了C中的值除外的那些值)
3、对C中的每一个值Ci
令board[x][y] = Ci;
行进到下一个位置,如果返回true,说明已找到正确的解,返回true;
否则,令board[x][y] = '.';
Code:
bool solveSudoku_(vector<vector<char>> &board, int x, int y){ if (board[x][y] != '.'){ if (y < 8) return solveSudoku_(board, x, y + 1); else if (x < 8) return solveSudoku_(board, x + 1, 0); else return true; }; vector<bool> digit(10, false); for (int i = 0; i < 9; ++i){ if (board[x][i] != '.') digit[board[x][i] - '0'] = true; if (board[i][y] != '.') digit[board[i][y] - '0'] = true; } int blockX = x / 3; int blockY = y / 3; for (int i = 0; i < 3; ++i){ for (int j = 0; j < 3; ++j){ if (board[blockX * 3 + i][blockY * 3 + j] != '.') digit[board[blockX * 3 + i][blockY * 3 + j] - '0'] = true; } } for (int i = 1; i <= 9; ++i){ if (!digit[i]){ board[x][y] = i + '0'; bool b = false; if (y < 8) b = solveSudoku_(board, x, y + 1); else if (x < 8) b = solveSudoku_(board, x + 1, 0); else return true; if (b) return true; board[x][y] = '.'; } } return false; } void solveSudoku(vector<vector<char> > &board) { solveSudoku_(board, 0, 0); for (int i = 0; i < board.size(); ++i){ for (int j = 0; j < board[i].size(); ++j){ cout << board[i][j] << " "; } cout << endl; } }
相关文章推荐
- [leetcode] 37. Sudoku Solver 解题报告
- 【HDU2780 - Su-Su-Sudoku】 解题报告+思路+代码,差点一次AC T^T
- LeetCode: solveSudoku 解题报告
- hdu 5547 Sudoku dfs 暴力回溯 解题报告
- POJ 3074 Sudoku 解题报告(Dancing Link)
- POJ 3076 Sudoku 解题报告(Dancing Link)
- POJ 2676 Sudoku 解题报告(Dancing Link)
- [Leetcode] 37. Sudoku Solver 解题报告
- 杭电 HOJ 1426 Sudoku Killer 解题报告
- POJ - 2676 Sudoku解题报告(解数独)
- POJ-2676 Sudoku 解题报告
- 杭电 HOJ 1016 Prime Ring Problem 解题报告
- LeetCode解题报告:LRU Cache
- 【解题报告】BestCoder Round #77 (div.2)
- SDOI2012 Round1 day2 集合(set)解题报告
- [LeetCode] Integer to Roman 解题报告
- 校内赛 不正常序列 堆 解题报告
- 杭电OJ题 1047 Integer Inquiry 解题报告
- 2014百度之星复赛解题报告复赛:Race
- POJ 3006 解题报告