leetcode 37. Sudoku Solver
2017-09-03 19:34
288 查看
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.
题目大意:
填充数独。要求每行每列每个小九宫格不能有相同的数字。
题目思路:
回溯法填数独。一直到格子全部填满p==81才返回true。
AC代码:
bool check(char** board,int p);
bool resolve(char** board,int p);
void solveSudoku(char** board, int boardRowSize, int boardColSize) {
resolve(board,0);
}
bool resolve(char** board,int p)
{
if(p==81) //一定要放在第一行,因为如果等于81的时候,就是第9行超出board的行列,会出现runtime error
return true;
int i=0;
int v=p/9;
int h=p%9;
char target=board[v][h];
if(target == '.')
{
for(i=1;i<=9;i++) //存放的数字是1-9
{
board[v][h]=i+'0';
if( check(board,p))
if(resolve(board,p+1) )
return true;
board[v][h]='.';
}
}
else
{
if( resolve(board,p+1) )
return true;
}
return false;
}
bool check(char** board,int p)
{
int v=p/9;
int h=p%9;
char target=board[v][h];
for(int i=0;i<9;i++)
{
if( (h != i) && (board[v][i] == target) ) return false;
if( (v != i) && (board[i][h] == target) ) return false;
}
int r=v/3*3;
int c=h/3*3;
for(int m=r;m<r+3;m++)
for(int n=c;n<c+3;n++)
{
if((m != v && n != h) && (target == board[m]
) )
{
return false;
}
}
return true;
}
Empty cells are indicated by the character
'.'.
You may assume that there will be only one unique solution.
题目大意:
填充数独。要求每行每列每个小九宫格不能有相同的数字。
题目思路:
回溯法填数独。一直到格子全部填满p==81才返回true。
AC代码:
bool check(char** board,int p);
bool resolve(char** board,int p);
void solveSudoku(char** board, int boardRowSize, int boardColSize) {
resolve(board,0);
}
bool resolve(char** board,int p)
{
if(p==81) //一定要放在第一行,因为如果等于81的时候,就是第9行超出board的行列,会出现runtime error
return true;
int i=0;
int v=p/9;
int h=p%9;
char target=board[v][h];
if(target == '.')
{
for(i=1;i<=9;i++) //存放的数字是1-9
{
board[v][h]=i+'0';
if( check(board,p))
if(resolve(board,p+1) )
return true;
board[v][h]='.';
}
}
else
{
if( resolve(board,p+1) )
return true;
}
return false;
}
bool check(char** board,int p)
{
int v=p/9;
int h=p%9;
char target=board[v][h];
for(int i=0;i<9;i++)
{
if( (h != i) && (board[v][i] == target) ) return false;
if( (v != i) && (board[i][h] == target) ) return false;
}
int r=v/3*3;
int c=h/3*3;
for(int m=r;m<r+3;m++)
for(int n=c;n<c+3;n++)
{
if((m != v && n != h) && (target == board[m]
) )
{
return false;
}
}
return true;
}
相关文章推荐
- LeetCode - 37. Sudoku Solver
- 【LeetCode】37. Sudoku Solver
- LeetCode --- 37. Sudoku Solver
- (Leetcode)37. Sudoku Solver
- leetcode 37. Sudoku Solver 一个经典的DFS深度优先搜索的做法
- 【LeetCode】37. Sudoku Solver 数独求解
- LeetCode 37. Sudoku Solver--回溯法
- [leetcode] 37. Sudoku Solver 解题报告
- [leetcode]37. Sudoku Solver
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
- LeetCode37. Sudoku Solver
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
- Leetcode 36. Valid Sudoku & 37. Sudoku Solver
- LeetCode [37. Sudoku Solver] 难度[hard]
- LeetCode 37. Sudoku Solver|DFS算法
- [TODO]LeetCode 37. Sudoku Solver
- 个人记录-LeetCode 37. Sudoku Solver
- [LeetCode]37. Sudoku Solver
- leetcode-37. Sudoku Solver
- LEETCODE 37. Sudoku Solver