/// <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); }
/// <summary> /// 创建数独,并将部分格子置空 /// </summary> /// <param name="num"></param> public void Create(int empty) { matrix = new int[9, 9]; //生成一个数独 CreateMatrix(); //PrintMatrix(); //实例一个无序的序列 avaFull = new Avails(81, false); for (int i = 0; i < empty;) { for (int j = 0; j < avaFull.Count; j++) { int v = avaFull[j] - 1; int r = v / 9; int c = v % 9; int t = matrix[r, c]; matrix[r, c] = 0; avaFull.Remove(v + 1); if (i > 3 && GetAnswerCount() > 1) { avaFull.Insert(j, v + 1); matrix[r, c] = t; } else { i++; break; } } } //int count = 0; ////按该序列的顺序删除 empty 个格子中的值 //while (count < empty) //{ // int v = avaFull[count++] - 1; // int r = v / 9; // int c = v % 9; // matrix[r, c] = 0; // avaFull.Remove(count); //} PrintMatrix(); }