一,数独的规则
- 横向上9个数字满足1-9不重复;
- 竖向上9个数字满足1-9不重复;
- 将大网格拆分为9个3*3的小网格,每个小网格内同样满足1-9不重复
二,生成数独的思路
首先准备一个空的数独,从第一个格子开始,按照数独的规则,把1-9依次试探性的填入,如果合法,就填入.如果不合法就判断下一个数合不合法,这样,一直到把第81个格子填完,就生成了一个完整的数独,但是因为这样生成的数独是一个固定的,所以,现在我们要随机把它打乱,根据数独的特性,在同一个小九宫格中的行和行之间交换位置,列与列之间交换位置,数独依然成立,打个比方,第0行和第2行,交换位置,第0列和第2列交换位置,数独依然成立.
这样随机打乱位置后,再根据要求的难度,随机挖空其中的一些格子,这样就生成了我们需要的数独题目了!
bool isValid(int row, int col, int num, vector<vector<char>>&board)
{
//检查行有没有重复的,如果有返回faulse
for (int i = 0; i < board.size(); i++)
{
if (num == board[row][i]-'0')
{
return false;
}
}
//检查列有没有重复的,如果有返回faulse
for (int i = 0; i < board.size(); i++)
{
if (num == board[i][col]-'0')return false;
}
//检查数字所在的方块有没有重复的,如果有返回faulse
int startrow = row / 3 * 3;
int startcol = col / 3 * 3;
int endrow = startrow + 3;
int endcol = startcol + 3;
for (int i = startrow; i < endrow; i++)
{
for (int j = startcol; j < endcol; j++)
{
if (num == board[i][j]-'0')return false;
}
}
return true;
}
void swapCol(int m, int n, vector<vector<char>>& board)
{
vector<char>temp(board.size(), ' ');
for (int i = 0; i < board.size(); i++)
{
temp[i] = board[i][m];
board[i][m] = board[i][n];
board[i][n] = temp[i];
}
}
void se