您的位置:首页 > 编程语言 > C语言/C++

关闭 leetcode_c++:哈希:Suduku_Solver(037)

2016-06-28 14:19 519 查看

题目

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.





算法

O(n!)

DFS

(借助网上的讨论)因为题目输入保证有且只有一个解,所以试探每一个格子的时候,只需要考虑当前行、列、矩形框满足条件,满足就进入下一个格子试探,不满足回溯。

注意判断一个格子落入哪个矩形框的设计,前面一题采用了比较trivial的方法!

class Solution {
public:
bool isValidSudoku(vector<vector<char> > &board,int row,int col){
for(int j=0;j<9;j++)
if(j != col && board[row][j] == board[row][col])
return false;

for(int i=0;i<9;i++)
if(i != row && board[i][col] == board[row][col])
return false;

int gridRow = row/3*3, gridCol = col/3*3;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(gridRow + i != row && gridCol + j != col && board[gridRow + i][gridCol + j] == board[row][col])
return false;
return true;
}

bool solveSudokuSingle(vector<vector<char> > &board){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(board[i][j] == '.'){
for(int k=1;k<=9;k++){
board[i][j] = '0' + k;
if(isValidSudoku(board,i,j) && solveSudokuSingle(board))
return true;
board[i][j] = '.';
}
return false;
}
return true;
}

void solveSudoku(vector<vector<char> > &board) {
solveSudokuSingle(board);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: