您的位置:首页 > 其它

[LeetCode] Sudoku Solver 解数独,递归,回溯

2014-12-03 23:57 423 查看
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.

#include <vector>
#include <iostream>
#include <iterator>
using namespace std;

class Solution {
public:
void solveSudoku(vector<vector<char> > &board) {
help(board,0,0,0,0);
}
bool help(vector<vector<char> > & board,int i,int ii,int j,int jj){
for(;i<9;i+=3){
for(;ii<3;ii++){
for(;j<9;j+=3){
for(;jj<3;jj++){
if(board[i+ii][j+jj]!='.')  continue;
bool finish = false;
for(char c='1';c<='9'&&!finish;c++){
bool canIn= true;
for(int k=0;k<9&&canIn;k++){
if(k!=i+ii&&board[k][j+jj]==c) canIn = false;
if(k!=j+jj&&board[i+ii][k]==c) canIn = false;
}
for(int ti=0;ti<3&&canIn;ti++){
if(ti == ii)   continue;
for(int tj=0;tj<3&&canIn;tj++){
if(tj==jj)    continue;
if(board[ti+i][tj+j]==c)    canIn = false;
}
}
if(canIn==false)    continue;
board[i+ii][j+jj] = c;
finish = help(board,i,ii,j,jj);
}
if(!finish){ board[i+ii][j+jj] = '.';   return false;   }
}
jj = 0;
}
j=0;
}
ii=0;
}
return true;
}
};

int main()
{
vector<char> line;
vector<vector<char> > board;
line = {'5','3','.','.','7','.','.','.','.'};
board.push_back(line);
line.clear();
line = {'6','.','.','1','9','5','.','.','.'};
board.push_back(line);
line.clear();
line = {'.','9','8','.','.','.','.','6','.'};
board.push_back(line);
line.clear();
line = {'8','.','.','.','6','.','.','.','3'};
board.push_back(line);
line.clear();
line = {'4','.','.','8','.','3','.','.','1'};
board.push_back(line);
line.clear();
line = {'7','.','.','.','2','.','.','.','6'};
board.push_back(line);
line.clear();
line = {'.','6','.','.','.','.','2','8','.'};
board.push_back(line);
line.clear();
line = {'.','.','.','4','1','9','.','.','5'};
board.push_back(line);
line.clear();
line = {'.','.','.','.','8','.','.','7','9'};
board.push_back(line);
Solution sol;
sol.solveSudoku(board);
for(int i=0;i<board.size();i++){
copy(board[i].begin(),board[i].end(),ostream_iterator<char>(cout," "));
cout<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: