题目为 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
思路为两次for循环,遍历数组,对使用集合存储键值对,分别的列、行、九宫格进行判断。代码如下
public bool IsValidSudoku(char[][] board)
{
List<Dictionary<int, bool>> liRows = new List<Dictionary<int, bool>>();
List<Dictionary<int, bool>> liCols = new List<Dictionary<int, bool>>();
List<Dictionary<int, bool>> liBox = new List<Dictionary<int, bool>>();
liBox.Add(new Dictionary<int, bool>());
liBox.Add(new Dictionary<int, bool>());
liBox.Add(new Dictionary<int, bool>());
//列
for (int i = 0; i < 9; i++)
{
liRows.Add(new Dictionary<int, bool>());
//对九宫格重新赋值
if (i / 3 != (i - 1) / 3)
{
liBox[0] = new Dictionary<int, bool>();
liBox[1] = new Dictionary<int, bool>();
liBox[2] = new Dictionary<int, bool>();
}
//行
for (int j = 0; j < 9; j++)
{
if (board[i][j] != '.')
{
//对每行进行判断筛选
if (liRows[i].ContainsKey(board[i][j]))
{
return false;
}
liRows[i].Add(board[i][j], true);
//列判断+存储
while (liCols.Count <= j)
{
liCols.Add(new Dictionary<int, bool>());
}
//对每行进行判断筛选
if (liCols[j].ContainsKey(board[i][j]))
{
return false;
}
liCols[j].Add(board[i][j], true);
//九宫格判断
if (liBox[j / 3].ContainsKey(board[i][j]))
{
return false;
}
liBox[j / 3].Add(board[i][j], true);
}
}
}
return true;
}