LeetCode Sudoku Solver 数独C++程序

Sudoku Solver

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.

1 使用两个循环，逐个检查所有的方格

2 每到一个方格，检查到位空，以‘.'字符代表，就循环使用’1‘<=a<=9字符测试是否合法。

3 如果a合法，那么就继续填写下一个

4 如果不合法那么就回溯到上一个空格。

1 当前测试'1'到'9'个数字都不合法，那么返回假

2 棋盘中所有空格都填满，那么就返回真

	const static int SQUNUM = 9;
const static int NUM = 3;

bool isValid(vector<vector<char> > &board, int row, int col)
{
int sRow = row / NUM;
int sCol = col / NUM;
for (int i = 0; i < SQUNUM; i++)
{
if (i != col && board[row][col] == board[row][i])
return false;
if (i != row && board[row][col] == board[i][col])
return false;
int r = sRow*NUM + i/NUM, c = sCol*NUM + i%NUM;
if (!(r == row && c == col) && board[row][col] == board[r][c])
return false;
}
return true;
}

bool solveSudoku(vector<vector<char> > &board)
{
for (int i = 0; i < SQUNUM; i++)
{
for (int j = 0; j < SQUNUM; j++)
{
if (board[i][j] == '.')
{
//本程序精华：主要的回溯思想就是这个循环和递归体现出来
//1. 逐个可行答案'1'->'9'去填写试一试是否可行
for (char a = '1'; a <= '9'; a++)
{
//填写
board[i][j] = a;
//测试是否可行
if (isValid(board, i, j) && solveSudoku(board))
//可行返回真
return true;
//不可行，回溯，即回到本次回溯前的状态
board[i][j] = '.';
}
//本格不符合规则，那么就可以马上返回了，所以不用到所有循环外。
//就是不用等到之后的循环完了。
return false;
}
}
}
//别忘记了最后，i==9&&j==9的时候跳出循环，这个时候就是成功了，要返回true
return true;
}

2014-1-26 update

class Solution {
public:
void solveSudoku(vector<vector<char> > &board)
{
solve2(board);
}

bool solve2(vector<vector<char> > &board, int row = 0, int col = 0)
{
if (row == 9) return true;

int nr = col==8? row+1:row;
int nc = col==8? 0:col+1;

if (board[row][col] != '.')
{
if (solve2(board, nr, nc)) return true;
}
else
{
for (char i = '1'; i <= '9'; i++)
{
board[row][col] = i;
if (isValid(board, row, col) && solve2(board, nr, nc)) return true;
}
board[row][col] = '.';
}
return false;
}

const static int SQUNUM = 9;
const static int NUM = 3;

bool isValid(vector<vector<char> > &board, int row, int col)
{
int sRow = row / NUM;
int sCol = col / NUM;
for (int i = 0; i < SQUNUM; i++)
{
if (i != col && board[row][col] == board[row][i])
return false;
if (i != row && board[row][col] == board[i][col])
return false;
//注意这里的计算公式：先定位小九宫大位置，然后小九宫里面的小位置
int r = sRow*NUM + i/NUM, c = sCol*NUM + i%NUM;
if (!(r == row && c == col) && board[row][col] == board[r][c])
return false;
}
return true;
}
};

[LeetCode] 037. Sudoku Solver (Hard) (C++)

2015-03-13 19:33:27

LeetCode 37 Sudoku Solver (C,C++,Java,Python)

2015-05-19 13:11:05

Sudoku solver in C++ (数独计算器)

2011年02月08日 408KB 下载

数独解法 C++实现

2016-01-31 20:04:19

求解数独的C++实现

2016-01-23 23:01:27

[C++] 回溯法生成数独

2016-03-11 05:28:15

用c++编写的数独游戏

2010年05月16日 106KB 下载

C语言实现的数独解题程序

2015-01-31 22:46:45

LeetCode37. Sudoku Solver

2016-12-10 14:50:23

LeetCode(37) Sudoku Solver

2015-03-23 07:55:02

不良信息举报

LeetCode Sudoku Solver 数独C++程序