按照人的思维来做的。
MyPos 就是 数组 行 列值。
public class CalcShuDu { public int[][] IArrSd; public int IBlankCount; public Dictionary<MyPos, List<int>> DicCanFill; public Dictionary<MyPos, List<int>> DicFilling; Dictionary<MyPos, int> dic = new Dictionary<MyPos, int>(); public CalcShuDu(int[][] arr) { IArrSd = arr; for (int i = 0; i < arr.Length; i++) { for (int j = 0; j < arr[i].Length; j++) { if (arr[i][j] == 0) { IBlankCount++; MyPos p = new MyPos(i, j); dic.Add(p, 0); } } } } public Dictionary<MyPos, int> GetAnswer() { DicFilling = new Dictionary<MyPos, List<int>>(); GetCanFill(); var keys = dic.Keys.ToList(); int fillCount = 0; bool isAdd = false; while (fillCount<= IBlankCount-1) { isAdd = false; if (fillCount < 0) { return dic; } var key = keys[fillCount]; if (DicFilling[key].Count>= DicCanFill[key].Count) { DicFilling[key].Clear(); IArrSd[key.X][key.Y] = 0; fillCount -= 1; key= keys[fillCount]; IArrSd[key.X][key.Y] = 0; continue; } var listCanFill = GetCanFill(key); if (listCanFill.Count == 0) { IArrSd[key.X][key.Y] = 0; fillCount -= 1; key = keys[fillCount]; IArrSd[key.X][key.Y] = 0; } else { foreach (var item in listCanFill) { if (!DicFilling[key].Contains(item)) { IArrSd[key.X][ key.Y] = item; DicFilling[key].Add(item); fillCount += 1; dic[key] = item; isAdd = true; break; } } if (!isAdd) { IArrSd[key.X][key.Y] = 0; DicFilling[key].Clear(); fillCount -= 1; key=keys[fillCount]; IArrSd[key.X][key.Y] = 0; } } } return dic; } public void GetCanFill() { DicCanFill = new Dictionary<MyPos, List<int>>(); var keys = dic.Keys.ToList(); foreach (var key in keys) { List<int> list1 = new List<int>(); DicFilling.Add(key, list1); List<int> list = new List<int>(); int i = key.X; int j = key.Y; var arr = IArrSd[i]; for (int k = 0; k < arr.Length; k++) { if(arr[k] != 0) { list.Add(arr[k]); } } for (int m = 0; m < 9; m++) { if (IArrSd[m][j] != 0) { if(!list.Contains(IArrSd[m][j])) list.Add(IArrSd[m][j]); } } var ninePos = GetNinePos(key); for (int m = ninePos.X; m < ninePos.X+3; m++) { for (int k = ninePos.Y; k < ninePos.Y+3; k++) { if (IArrSd[m][k] != 0) { if (!list.Contains(IArrSd[m][k])) list.Add(IArrSd[m][k]); } } } list.Sort(); var lstCanFill=new List<int>(); for (int m = 1; m < 10; m++) { if (!list.Contains(m)) { lstCanFill.Add(m); } } DicCanFill.Add(key, lstCanFill); } } public MyPos GetNinePos(MyPos pos) { int i = 0; int j = 0; int x=pos.X; int y=pos.Y; if (x >= 0 && x < 3) { if (y >= 0 && y < 3) { i = 0; j= 0; } else if (y >= 3 && y < 6) { i = 3; j = 0; } else { i = 6; j = 0; } } else if (x >= 3 && x < 6) { if (y >= 0 && y < 3) { i = 0; j = 3; } else if (y >= 3 && y < 6) { i = 3; j = 3; } else { i = 6; j = 3; } } else { if (y >= 0 && y < 3) { i = 0; j = 6; } else if (y >= 3 && y < 6) { i = 3; j = 6; } else { i = 6; j = 6; } } return new MyPos(j,i); } public List<int>GetCanFill(MyPos key) { var list = new List<int>(); int i = key.X; int j = key.Y; var arr = IArrSd[i]; for (int k = 0; k < arr.Length; k++) { if (arr[k] != 0) { list.Add(arr[k]); } } for (int m = 0; m < 9; m++) { if (IArrSd[m][j] != 0) { if (!list.Contains(IArrSd[m][j])) list.Add(IArrSd[m][j]); } } var ninePos = GetNinePos(key); for (int m = ninePos.X; m < ninePos.X + 3; m++) { for (int k = ninePos.Y; k < ninePos.Y + 3; k++) { if (IArrSd[m][k] != 0) { if (!list.Contains(IArrSd[m][k])) list.Add(IArrSd[m][k]); } } } list.Sort(); var lstCanFill = new List<int>(); for (int m = 1; m < 10; m++) { if (!list.Contains(m)) { lstCanFill.Add(m); } } return lstCanFill; } }