主要的代码如下,
vector<vector<int>> row(9, vector<int>(10)); # 检测每一行
vector<vector<int>> col(9, vector<int>(10)); # 检测每一列
vector<vector<int>> local(9, vector<int>(10)); # 检测每一个单位九宫格
vector<vector<vector<char>>> board_res_array; # 保存每个符合要求的结果
const vector<vector<char>> board({ {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'}, {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'}, {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'}, {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'}, {'.', '.', '.', '.', '8', '.', '.', '7', '9'} });
bool myCheck(const vector<vector<char>> & board, int x, int y, int v)
{
int cur_v = v;
if (row[x][cur_v] || col[y][cur_v] || local[x / 3 * 3 + y / 3][cur_v]) return false;
return true;
}
void pref(vector<vector<char>> & board)
{
for(int x=0; x<9; x++)
for(int y=0; y<9; y++)
{
if (board[x][y] != '.')
{
int _cur = board[x][y] - '0';
row[x][_cur] += 1;
col[y][_cur] += 1;
local[x / 3 * 3 + y / 3][_cur] += 1;
}
}
}
void f(vector<vector<char>> & board, int x, int y)
{
int n = 8;
if (x == y && x == n)
{
vector<vector<char>> _res(board);
board_res_array.push_back(_res); # 保存结果
return;
}
auto next_pair = netPos(x, y);
int _x;
int _y;
std::tie(_x, _y) = next_pair;
if (board[x][y] != '.')
{
int cur_v = board[x][y] - '0';
row[x][cur_v] += 1;
col[y][cur_v] += 1;
local[x / 3 * 3 + y / 3][cur_v] += 1;
f(board, _x, _y);
}
else
{
for (int i = 1; i <= 9; i++)
{
if (myCheck(board, x, y, i))
{
char _num = '0' + i;
int cur_v = i;
row[x][cur_v] += 1;
col[y][cur_v] += 1;
local[x / 3 * 3 + y / 3][cur_v] += 1;
board[x][y] = _num;
f(board, _x, _y);
board[x][y] = '.';
row[x][cur_v] -= 1;
col[y][cur_v] -= 1;
local[x / 3 * 3 + y / 3][cur_v] -= 1;
}
}
}
}
int main()
{
pref(board);
f(board, 0, 0);
cout << endl;
return 0;
}
然后为了肉眼可见的显示遍历过程,用cocos做了一个简单的九宫格演示,如下所示:
脚本下载地址,用vs2017打开就行,2015应该也没问题
主要思路就是遍历求解。