Sudoku Solver

来源:互联网 发布:java程序员怎么样 编辑:程序博客网 时间:2024/06/05 18:46

题目描述:

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.

解题思路:使用回溯法


AC代码如下:

class Solution {public:   bool isOK(const vector<vector<char>>& board, const vector<int>& positions,int index){int row = positions[index] / 9;int col = positions[index] % 9;int count[10] = { 0 };for (int i = 0; i < 9; i++){if (board[row][i] != '.'){int num = board[row][i] - '0';count[num]++;if (count[num]>1 && num>0){return false;}}}int count2[10] = { 0 };for (int i = 0; i < 9; i++){if (board[i][col] != '.'){int num = board[i][col] - '0';count2[num]++;if (count2[num]>1 && num>0){return false;}}}int count3[10] = { 0 };int a = row / 3;int b = col / 3;for (int i = 0; i < 9; i++){int c = i / 3;int d = i % 3;char tmp = board[3 * a + c][3 * b + d];if (tmp != '.'){int num = tmp - '0';count3[num]++;if (count3[num]>1 && num>0){return false;}}}return true;}void solveSudoku(vector<vector<char>>& board){int n = 0;vector<int> values;vector<int> positions;for (int i = 0; i < 9; i++)for (int j = 0; j < 9; j++){   if (board[i][j] == '.'){   n++;   board[i][j] = '0';   values.push_back(0);   positions.push_back(9 * i + j);   }}int index = 0;while (index >= 0){values[index]++;board[positions[index] / 9][positions[index] % 9]++;while (values[index] < 10 && !isOK(board, positions, index)){values[index]++;board[positions[index] / 9][positions[index] % 9]++;}if (values[index] >= 10){values[index] = 0;board[positions[index] / 9][positions[index] % 9] = '0';index--;}else{if (index == n - 1){return;}else{index++;}}}}};


0 0
原创粉丝点击