/// <summary> /// 用递归尝试填充单元格 /// </summary> /// <param name="rc"></param> private void GetRCValue(int rc) { if (rc >= 80) { answerCount++; return; } if (avaFull.Contains(rc + 1)) { GetRCValue(rc + 1); } else { int r = rc / 9; int c = rc % 9; Avails ava = GetOptional(r, c); for (int i = 0; i < ava.Count; i++) { int value = ava[i]; this[r, c] = value; if (!isError) { GetRCValue(rc + 1); this[r, c] = 0; } else { GetRCValue(rc + 1); } } } }
/// <summary> /// 获取指定行列的可选序列,该序列中的值不与所在行列宫中的任何一个值冲突 /// </summary> /// <param name="r"></param> /// <param name="t"></param> /// <returns></returns> public Avails GetOptional(int r, int c) { //初始化一个随机的可选序列,随机是为了防止多次生成一样的数独 Avails ava = new Avails(9, true); //将本行出现过的值从序列中删除 for (var i = 0; i < 9; i++) { if (i == c) { continue; } if (ava.Contains(matrix[r, i])) { ava.Remove(matrix[r, i]); } } //将本列出现过的值从序列中删除 for (var i = 0; i < 9; i++) { if (i == r) { continue; } if (ava.Contains(matrix[i, c])) { ava.Remove(matrix[i, c]); } } //将本宫出现过的值从序列中删除 for (int i = r / 3 * 3; i < r / 3 * 3 + 3; i++) { for (int j = c / 3 * 3; j < c / 3 * 3 + 3; j++) { if (i == r && j == c) { continue; } if (ava.Contains(matrix[i, j])) { ava.Remove(matrix[i, j]); } } } return(ava); }