0、数独简介

数独(すうどく,Sūdoku)是一种运用纸、笔进行演算的逻辑游戏。以九阶数独为例,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。

1)4阶(可填数字范围1~4,宫格2阶)

2)9阶(可填数字范围1~9,宫格3阶)

3)16阶(可填数字范围1~16,宫格4阶)

*见附录

1、数独的表示

对于N阶数独可以用一个N*N的二维数组表示

1)数独阶数GridRank=N

2)宫格阶数SubGridRank=Sqrt(N)

3)数独包含宫的阶数SubGridIncludeRank=Sqrt(N)

4)可填最大数字MaxValue=N

5)可填最小数字MinValue=1

  1. Public Class SudokuClass
  2. Public Property Rank As Integer '数独的阶数
  3. Get
  4. Return GridRank
  5. End Get
  6. Set(ByVal value As Integer)
  7. GridRank = value
  8. SubGridRank = CType(Math.Sqrt(value), Integer)
  9. SubGridIncludeRank = SubGridRank
  10. DataMaxValue = value
  11. DataMinValue = 1
  12. End Set
  13. End Property
  14. Public Property GridData As Integer?(,) '数独的数据
  15. Private GridRank As Integer '数独的阶数
  16. Private SubGridRank As Integer '子数独(宫)的阶数
  17. Private SubGridIncludeRank As Integer '数独包含子数独(宫)的阶数
  18. Private DataMaxValue As Integer '数独可填最大数值
  19. Private DataMinValue As Integer '数独可填最小数值
  20. ''' <summary>
  21. ''' 实例化一个指定阶数的数独类
  22. ''' </summary>
  23. ''' <param name="nRank">指定的阶数</param>
  24. Public Sub New(nRank As Integer)
  25. Me.Rank = nRank
  26. End Sub
  27. End Class

复制代码

6)任意阶数独的表示(N≠K2,K>1,K∈Z)

任意阶数独仅有一个宫,所以数独阶数和宫阶数相等。以7阶为例,设置GridRank=7,SubGridRank=7,SubGridIncludeRank=1即可。

2、数独的求解

采用回溯法,直接寻找到一个空白格,尝试填入所有可能的数字,继续填下一个空白格,直至填满或者不能继续填入为止(不符合规则)。

1)寻找空白格

空白格的选择至关重要,当一个格子的限制越多,也就是可填入数字越少时,优先选择该空白格。这样做可以大大降低递归填格子的次数。

  1. '查找当前空白格(最佳格)
  2. Private Function getStartPoint(ByRef data As Integer?(,)) As Point
  3. Dim gPoint As Point
  4. Dim tempValue As Integer
  5. Dim maxValue As Integer
  6. '查找限制最多的空白格
  7. For i = 0 To GridRank - 1
  8. For j = 0 To GridRank - 1
  9. If data(i, j) = 0 Then
  10. tempValue = 0
  11. For k = 0 To GridRank - 1
  12. If data(i, k) > 0 Then tempValue += 1
  13. If data(k, j) > 0 Then tempValue += 1
  14. If data((i \ SubGridIncludeRank) * SubGridIncludeRank + k \ SubGridIncludeRank, (j \ SubGridIncludeRank) * SubGridIncludeRank + (k Mod SubGridIncludeRank)) > 0 Then tempValue += 1
  15. Next
  16. If tempValue > maxValue Then
  17. maxValue = tempValue
  18. gPoint.X = i
  19. gPoint.Y = j
  20. End If
  21. End If
  22. Next
  23. Next
  24. If maxValue > 0 Then
  25. Return gPoint
  26. Else
  27. gPoint.X = -1
  28. gPoint.Y = -1
  29. Return gPoint
  30. End If
  31. End Function

复制代码

当确定空白格后就需要向其中填入数字了,一一筛选出符合规则的数字。规则就是格子当前行,当前列,当前宫不能有相同数值出现。

  1. '判断同行同列同宫是否已经存在
  2. Private Function GetExisting(ByRef data As Integer?(,), ByVal gX As Integer, ByVal gY As Integer, ByVal gValue As Integer) As Boolean
  3. For k = 0 To GridRank - 1
  4. If data(gX, k) = gValue OrElse data(k, gY) = gValue OrElse data((gX \ SubGridIncludeRank) * SubGridIncludeRank + k \ SubGridIncludeRank, (gY \ SubGridIncludeRank) * SubGridIncludeRank + (k Mod SubGridIncludeRank)) = gValue Then
  5. Return True
  6. End If
  7. Next
  8. Return False
  9. End Function

复制代码

2)回溯法求解

简单的递归调用即可。

  1. '递归求解数独
  2. Private Function GetValue(ByVal gData As Integer?(,)) As List(Of Integer?(,))
  3. Dim ResultList As New List(Of Integer?(,))
  4. Dim i, j As Integer
  5. Dim tempPoint As Point = getStartPoint(gData)
  6. i = tempPoint.X : j = tempPoint.Y
  7. If i >= 0 AndAlso j >= 0 Then
  8. For value = DataMinValue To DataMaxValue
  9. If GetExisting(gData, i, j, value) = False Then
  10. gData(i, j) = value
  11. GetValue(gData)
  12. gData(i, j) = 0
  13. End If
  14. Next
  15. Else
  16. '新增一个结果
  17. ResultList.Add(gData)
  18. End If
  19. Return ResultList
  20. End Function

复制代码

3)其他

判断一个序列(数组)中是否有重复数字

  1. ''' <summary>
  2. ''' 判断一个序列是否有重复数字
  3. ''' </summary>
  4. ''' <param name="Numbers"></param>
  5. ''' <returns></returns>
  6. Private Function IsDuplicate(ByVal Numbers() As Integer) As Boolean
  7. Array.Sort(Numbers)
  8. If Numbers.Length > 1 Then
  9. For i = 0 To Numbers.Length - 2
  10. If Numbers(i) = Numbers(i + 1) Then Return True
  11. Next
  12. End If
  13. Return False
  14. End Function

复制代码

判断数独是否填写完毕,无空白格且所有格子填入的数字符合规则

  1. Public Function IsWin(ByVal Numbers As Integer?(,)) As Boolean
  2. For i = 0 To GridRank - 1
  3. For j = 0 To GridRank - 1
  4. If Not Numbers(i, j).HasValue Then Return False '出现空格
  5. Next
  6. Next
  7. Dim TempInt As New List(Of Integer)
  8. '判断行重复
  9. For i = 0 To GridRank - 1
  10. TempInt.Clear()
  11. For j = 0 To GridRank - 1
  12. TempInt.Add(CInt(Numbers(i, j)))
  13. Next
  14. If IsDuplicate(TempInt.ToArray) Then Return False
  15. Next
  16. '判断列重复
  17. For j = 0 To GridRank - 1
  18. TempInt.Clear()
  19. For i = 0 To GridRank - 1
  20. TempInt.Add(CInt(Numbers(i, j)))
  21. Next
  22. If IsDuplicate(TempInt.ToArray) Then Return False
  23. Next
  24. '判断宫格重复
  25. For i = 0 To GridRank - 1 Step SubGridRank
  26. For j = 0 To GridRank - 1 Step SubGridRank
  27. TempInt.Clear()
  28. For i2 = 0 To SubGridRank - 1
  29. For j2 = 0 To SubGridRank - 1
  30. TempInt.Add(CInt(Numbers(i + i2, j + j2)))
  31. Next
  32. Next
  33. If IsDuplicate(TempInt.ToArray) Then Return False
  34. Next
  35. Next
  36. Return True
  37. End Function

复制代码

判断当前数独是否符合规则,检查手机游戏拍卖每一个非空白格的数字的同行、同列、同宫是否重复。

  1. Public Function IsImpossible(ByVal Numbers As Integer?(,)) As Boolean
  2. Dim temp As Integer?
  3. For i = 0 To GridRank - 1
  4. For j = 0 To GridRank - 1
  5. If Not Numbers(i, j) = 0 Then
  6. temp = Numbers(i, j)
  7. Numbers(i, j) = 0
  8. If GetExisting(Numbers, i, j, CInt(temp)) Then Numbers(i, j) = temp : Return True
  9. Numbers(i, j) = temp
  10. End If
  11. Next
  12. Next
  13. Return False
  14. End Function

复制代码

附录

1)16阶(可填数字范围1~16,宫格4阶)

2)VB.NET类 & C#类(在线工具转换,仅供参考)

  1. Public Class SudokuClass
  2. Public Property Rank As Integer '数独的阶数
  3. Get
  4. Return GridRank
  5. End Get
  6. Set(ByVal value As Integer)
  7. GridRank = value
  8. SubGridRank = CType(Math.Sqrt(value), Integer)
  9. SubGridIncludeRank = SubGridRank
  10. DataMaxValue = value
  11. DataMinValue = 1
  12. End Set
  13. End Property
  14. Public Property GridData As Integer?(,) '数独的数据
  15. Private GridRank As Integer '数独的阶数
  16. Private SubGridRank As Integer '子数独(宫)的阶数
  17. Private SubGridIncludeRank As Integer '数独包含子数独(宫)的阶数
  18. Private DataMaxValue As Integer '数独可填最大数值
  19. Private DataMinValue As Integer '数独可填最小数值
  20. ''' <summary>
  21. ''' 实例化一个指定阶数的数独类
  22. ''' </summary>
  23. ''' <param name="nRank">指定的阶数</param>
  24. Public Sub New(nRank As Integer)
  25. Me.Rank = nRank
  26. End Sub
  27. Public Function GenerateInitialNumbers() As Integer?(,)
  28. ReDim GridData(GridRank - 1, GridRank - 1)
  29. For i = 0 To GridRank - 1
  30. For j = 0 To GridRank - 1
  31. GridData(i, j) = 0 '暂无初始数字生成规则,请从数独文件导入
  32. Next
  33. Next
  34. Return GridData '返回一个空白数独
  35. End Function
  36. Public Function IsImpossible(ByVal Numbers As Integer?(,)) As Boolean
  37. Dim temp As Integer?
  38. For i = 0 To GridRank - 1
  39. For j = 0 To GridRank - 1
  40. If Not Numbers(i, j) = 0 Then
  41. temp = Numbers(i, j)
  42. Numbers(i, j) = 0
  43. If GetExisting(Numbers, i, j, CInt(temp)) Then Numbers(i, j) = temp : Return True
  44. Numbers(i, j) = temp
  45. End If
  46. Next
  47. Next
  48. Return False
  49. End Function
  50. Public Function IsWin(ByVal Numbers As Integer?(,)) As Boolean
  51. For i = 0 To GridRank - 1
  52. For j = 0 To GridRank - 1
  53. If Not Numbers(i, j).HasValue Then Return False '出现空格
  54. Next
  55. Next
  56. Dim TempInt As New List(Of Integer)
  57. '判断行重复
  58. For i = 0 To GridRank - 1
  59. TempInt.Clear()
  60. For j = 0 To GridRank - 1
  61. TempInt.Add(CInt(Numbers(i, j)))
  62. Next
  63. If IsDuplicate(TempInt.ToArray) Then Return False
  64. Next
  65. '判断列重复
  66. For j = 0 To GridRank - 1
  67. TempInt.Clear()
  68. For i = 0 To GridRank - 1
  69. TempInt.Add(CInt(Numbers(i, j)))
  70. Next
  71. If IsDuplicate(TempInt.ToArray) Then Return False
  72. Next
  73. '判断宫格重复
  74. For i = 0 To GridRank - 1 Step SubGridRank
  75. For j = 0 To GridRank - 1 Step SubGridRank
  76. TempInt.Clear()
  77. For i2 = 0 To SubGridRank - 1
  78. For j2 = 0 To SubGridRank - 1
  79. TempInt.Add(CInt(Numbers(i + i2, j + j2)))
  80. Next
  81. Next
  82. If IsDuplicate(TempInt.ToArray) Then Return False
  83. Next
  84. Next
  85. Return True
  86. End Function
  87. ''' <summary>
  88. ''' 判断一个序列是否有重复数字
  89. ''' </summary>
  90. ''' <param name="Numbers"></param>
  91. ''' <returns></returns>
  92. Private Function IsDuplicate(ByVal Numbers() As Integer) As Boolean
  93. Array.Sort(Numbers)
  94. If Numbers.Length > 1 Then
  95. For i = 0 To Numbers.Length - 2
  96. If Numbers(i) = Numbers(i + 1) Then Return True
  97. Next
  98. End If
  99. Return False
  100. End Function
  101. ''' <summary>
  102. ''' 返回指定位置的所有可填数字的序列
  103. ''' </summary>
  104. ''' <param name="Numbers">原数组</param>
  105. ''' <param name="gX">指定的位置的X值,从0开始</param>
  106. ''' <param name="gY">指定的位置的Y值,从0开始</param>
  107. ''' <returns></returns>
  108. Public Function GetEnabledNum(ByVal Numbers As Integer?(,), gX As Integer, gY As Integer) As Integer()
  109. Dim NumList As New List(Of Integer)
  110. For i = DataMinValue To DataMaxValue
  111. If GetExisting(Numbers, gX, gY, i) = False Then NumList.Add(i)
  112. Next
  113. Return NumList.ToArray
  114. End Function
  115. '递归求解数独
  116. Private Function GetValue(ByVal gData As Integer?(,)) As List(Of Integer?(,))
  117. Dim ResultList As New List(Of Integer?(,))
  118. Dim i, j As Integer
  119. Dim tempPoint As Point = getStartPoint(gData)
  120. i = tempPoint.X : j = tempPoint.Y
  121. If i >= 0 AndAlso j >= 0 Then
  122. For value = DataMinValue To DataMaxValue
  123. If GetExisting(gData, i, j, value) = False Then
  124. gData(i, j) = value
  125. GetValue(gData)
  126. gData(i, j) = 0
  127. End If
  128. Next
  129. Else
  130. '新增一个结果
  131. ResultList.Add(gData)
  132. End If
  133. Return ResultList
  134. End Function
  135. '查找当前空白格(最佳格)
  136. Private Function getStartPoint(ByRef data As Integer?(,)) As Point
  137. Dim gPoint As Point
  138. Dim tempValue As Integer
  139. Dim maxValue As Integer
  140. '查找限制最多的空白格
  141. For i = 0 To GridRank - 1
  142. For j = 0 To GridRank - 1
  143. If data(i, j) = 0 Then
  144. tempValue = 0
  145. For k = 0 To GridRank - 1
  146. If data(i, k) > 0 Then tempValue += 1
  147. If data(k, j) > 0 Then tempValue += 1
  148. If data((i \ SubGridIncludeRank) * SubGridIncludeRank + k \ SubGridIncludeRank, (j \ SubGridIncludeRank) * SubGridIncludeRank + (k Mod SubGridIncludeRank)) > 0 Then tempValue += 1
  149. Next
  150. If tempValue > maxValue Then
  151. maxValue = tempValue
  152. gPoint.X = i
  153. gPoint.Y = j
  154. End If
  155. End If
  156. Next
  157. Next
  158. If maxValue > 0 Then
  159. Return gPoint
  160. Else
  161. gPoint.X = -1
  162. gPoint.Y = -1
  163. Return gPoint
  164. End If
  165. End Function
  166. '判断同行同列同宫是否已经存在
  167. Private Function GetExisting(ByRef data As Integer?(,), ByVal gX As Integer, ByVal gY As Integer, ByVal gValue As Integer) As Boolean
  168. For k = 0 To GridRank - 1
  169. If data(gX, k) = gValue OrElse data(k, gY) = gValue OrElse data((gX \ SubGridIncludeRank) * SubGridIncludeRank + k \ SubGridIncludeRank, (gY \ SubGridIncludeRank) * SubGridIncludeRank + (k Mod SubGridIncludeRank)) = gValue Then
  170. Return True
  171. End If
  172. Next
  173. Return False
  174. End Function
  175. End Class

复制代码

  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7. public class SudokuClass
  8. {
  9. public int Rank {
  10. //数独的阶数
  11. get { return GridRank; }
  12. set {
  13. GridRank = value;
  14. SubGridRank = Convert.ToInt32(Math.Sqrt(value));
  15. SubGridIncludeRank = SubGridRank;
  16. DataMaxValue = value;
  17. DataMinValue = 1;
  18. }
  19. }
  20. public int?[,] GridData { get; set; }
  21. //数独的数据
  22. //数独的阶数
  23. private int GridRank;
  24. //子数独(宫)的阶数
  25. private int SubGridRank;
  26. //数独包含子数独(宫)的阶数
  27. private int SubGridIncludeRank;
  28. //数独可填最大数值
  29. private int DataMaxValue;
  30. //数独可填最小数值
  31. private int DataMinValue;
  32. /// <summary>
  33. /// 实例化一个指定阶数的数独类
  34. /// </summary>
  35. /// <param name="nRank">指定的阶数</param>
  36. public SudokuClass(int nRank)
  37. {
  38. this.Rank = nRank;
  39. }
  40. public int?[,] GenerateInitialNumbers()
  41. {
  42. GridData = new Nullable<int>[GridRank, GridRank];
  43. for (i = 0; i <= GridRank - 1; i++) {
  44. for (j = 0; j <= GridRank - 1; j++) {
  45. GridData[i, j] = 0;
  46. //暂无初始数字生成规则,请从数独文件导入
  47. }
  48. }
  49. return GridData;
  50. //返回一个空白数独
  51. }
  52. public bool IsImpossible(int?[,] Numbers)
  53. {
  54. int? temp = default(int?);
  55. for (i = 0; i <= GridRank - 1; i++) {
  56. for (j = 0; j <= GridRank - 1; j++) {
  57. if (!(Numbers[i, j] == 0)) {
  58. temp = Numbers[i, j];
  59. Numbers[i, j] = 0;
  60. if (GetExisting(ref Numbers, i, j, Convert.ToInt32(temp))){Numbers[i, j] = temp;return true;}
  61. Numbers[i, j] = temp;
  62. }
  63. }
  64. }
  65. return false;
  66. }
  67. public bool IsWin(int?[,] Numbers)
  68. {
  69. for (i = 0; i <= GridRank - 1; i++) {
  70. for (j = 0; j <= GridRank - 1; j++) {
  71. if (!Numbers[i, j].HasValue)
  72. return false;
  73. //出现空格
  74. }
  75. }
  76. List<int> TempInt = new List<int>();
  77. //判断行重复
  78. for (i = 0; i <= GridRank - 1; i++) {
  79. TempInt.Clear();
  80. for (j = 0; j <= GridRank - 1; j++) {
  81. TempInt.Add(Convert.ToInt32(Numbers[i, j]));
  82. }
  83. if (IsDuplicate(TempInt.ToArray()))
  84. return false;
  85. }
  86. //判断列重复
  87. for (j = 0; j <= GridRank - 1; j++) {
  88. TempInt.Clear();
  89. for (i = 0; i <= GridRank - 1; i++) {
  90. TempInt.Add(Convert.ToInt32(Numbers[i, j]));
  91. }
  92. if (IsDuplicate(TempInt.ToArray()))
  93. return false;
  94. }
  95. //判断宫格重复
  96. for (i = 0; i <= GridRank - 1; i += SubGridRank) {
  97. for (j = 0; j <= GridRank - 1; j += SubGridRank) {
  98. TempInt.Clear();
  99. for (i2 = 0; i2 <= SubGridRank - 1; i2++) {
  100. for (j2 = 0; j2 <= SubGridRank - 1; j2++) {
  101. TempInt.Add(Convert.ToInt32(Numbers[i + i2, j + j2]));
  102. }
  103. }
  104. if (IsDuplicate(TempInt.ToArray()))
  105. return false;
  106. }
  107. }
  108. return true;
  109. }
  110. /// <summary>
  111. /// 判断一个序列是否有重复数字
  112. /// </summary>
  113. /// <param name="Numbers"></param>
  114. /// <returns></returns>
  115. private bool IsDuplicate(int[] Numbers)
  116. {
  117. Array.Sort(Numbers);
  118. if (Numbers.Length > 1) {
  119. for (i = 0; i <= Numbers.Length - 2; i++) {
  120. if (Numbers[i] == Numbers[i + 1])
  121. return true;
  122. }
  123. }
  124. return false;
  125. }
  126. /// <summary>
  127. /// 返回指定位置的所有可填数字的序列
  128. /// </summary>
  129. /// <param name="Numbers">原数组</param>
  130. /// <param name="gX">指定的位置的X值,从0开始</param>
  131. /// <param name="gY">指定的位置的Y值,从0开始</param>
  132. /// <returns></returns>
  133. public int[] GetEnabledNum(int?[,] Numbers, int gX, int gY)
  134. {
  135. List<int> NumList = new List<int>();
  136. for (i = DataMinValue; i <= DataMaxValue; i++) {
  137. if (GetExisting(ref Numbers, gX, gY, i) == false)
  138. NumList.Add(i);
  139. }
  140. return NumList.ToArray();
  141. }
  142. //递归求解数独
  143. private List<int?[,]> GetValue(int?[,] gData)
  144. {
  145. List<int?[,]> ResultList = new List<int?[,]>();
  146. int i = 0;
  147. int j = 0;
  148. Point tempPoint = getStartPoint(ref gData);
  149. i = tempPoint.X;
  150. j = tempPoint.Y;
  151. if (i >= 0 && j >= 0) {
  152. for (value = DataMinValue; value <= DataMaxValue; value++) {
  153. if (GetExisting(ref gData, i, j, value) == false) {
  154. gData[i, j] = value;
  155. GetValue(gData);
  156. gData[i, j] = 0;
  157. }
  158. }
  159. } else {
  160. //新增一个结果
  161. ResultList.Add(gData);
  162. }
  163. return ResultList;
  164. }
  165. //查找当前空白格(最佳格)
  166. private Point getStartPoint(ref int?[,] data)
  167. {
  168. Point gPoint = default(Point);
  169. int tempValue = 0;
  170. int maxValue = 0;
  171. //查找限制最多的空白格
  172. for (i = 0; i <= GridRank - 1; i++) {
  173. for (j = 0; j <= GridRank - 1; j++) {
  174. if (data[i, j] == 0) {
  175. tempValue = 0;
  176. for (k = 0; k <= GridRank - 1; k++) {
  177. if (data[i, k] > 0)
  178. tempValue += 1;
  179. if (data[k, j] > 0)
  180. tempValue += 1;
  181. if (data[(i / SubGridIncludeRank) * SubGridIncludeRank + k / SubGridIncludeRank, (j / SubGridIncludeRank) * SubGridIncludeRank + (k % SubGridIncludeRank)] > 0)
  182. tempValue += 1;
  183. }
  184. if (tempValue > maxValue) {
  185. maxValue = tempValue;
  186. gPoint.X = i;
  187. gPoint.Y = j;
  188. }
  189. }
  190. }
  191. }
  192. if (maxValue > 0) {
  193. return gPoint;
  194. } else {
  195. gPoint.X = -1;
  196. gPoint.Y = -1;
  197. return gPoint;
  198. }
  199. }
  200. //判断同行同列同宫是否已经存在
  201. private bool GetExisting(ref int?[,] data, int gX, int gY, int gValue)
  202. {
  203. for (k = 0; k <= GridRank - 1; k++) {
  204. if (data[gX, k] == gValue || data[k, gY] == gValue || data[(gX / SubGridIncludeRank) * SubGridIncludeRank + k / SubGridIncludeRank, (gY / SubGridIncludeRank) * SubGridIncludeRank + (k % SubGridIncludeRank)] == gValue) {
  205. return true;
  206. }
  207. }
  208. return false;
  209. }
  210. }

复制代码

数独游戏求解:解法适用于任意阶数的数独相关推荐

  1. 数独游戏的解法到App的实现

    在LeetCode上偶然刷到一个解数独的题目: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次 ...

  2. c语言实现数独游戏求解

    数独游戏,c语言 玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 输入包含9x9的已知数字,空位用0补齐,中间用空格隔开 ...

  3. 数独游戏前端学习笔记及后续解数独方法

    学习于默课网学习视频的整理笔记 视频老师分享代码库 基于我本地已经安装了nmp/node所以只添加了yarn 安装yarn: npm install -g yarn 安装成功后,查看版本号yarn - ...

  4. python数独游戏源代码100行_python实现解数独程序代码

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  5. python可以数独游戏吗_如何用Python创建数独游戏

    你可以生成一个随机数独解决方案板,在那里所有的数字都被填写,然后删除其中一些,以创建拼图.这将确保谜题始终有一个解决方案.确保它只有一个解决方案会更具挑战性(提示:一个9x9数独游戏必须至少留下17个 ...

  6. 数独游戏python制作_使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...

  7. 数独游戏-C语言实现

    数独游戏-C语言实现 目标 写一个数独游戏,有以下功能: 1:能随机产生题目并给出答案. 2:求解输入的题目并输出答案. 实现说明 参照百度百科等资料可以知道求解数独的主要算法是:1.通过行.列和宫格 ...

  8. 怎样设计解开数独游戏

    很早之前大概是2014年的时候,我用WPF就是C#啦,写了一个数独游戏,那时之所以有这个想法,主要还是因为更早之前玩数独游戏时基本没有把题目解出,有点小受伤,但本葛葛毕竟是程序员啊,我解不出,可以用程 ...

  9. C语言学习 数独游戏

    摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. C语言学习 数独游戏 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 ...

最新文章

  1. 一堂拯救万千股民的公开课
  2. 从事GIS开发多年,2017年对GIS行业的心得,尤其对三维GIS的理解
  3. Hyper-V 2016 系列教程12 Hyper-V 体系结构
  4. mat opencv 修改roi_OpenCV中如何提取不规则ROI区域
  5. AGG第二课 代码框架以及命名规则
  6. html5 canvas获取坐标系,HTML5 Canvas坐标变换
  7. VTK:Points之ExtractEnclosedPoints
  8. [Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
  9. CV Code | 本周新出计算机视觉开源代码汇总(南理SGE 和Intel的实时动作识别很吸引人)...
  10. 如何从wireshark 抓包中的RTP导出 H.264 PAYLOAD,变成可用暴风直接播放的H264 裸码流文件
  11. vba模拟鼠标点击_手把手教罗技鼠标宏挂通行证编程
  12. 手机怎么打开html游戏,网页游戏打不开怎么解决 网页游戏打不开解决方法
  13. hdb3编码规则波形_当输入分别为全1,全0,m序列码时,写出他们的AMI和HDB3编码结果,并记录对应的波形图P101和TP103.(共6个图)...
  14. edp协议 netty_大牛轻松带你玩转Arduino智能硬件:EDP协议连接onenet平台
  15. r语言 c d生产函数,R语言定义多维数组和数组的运算
  16. 快乐西游mysql_快乐西游的海玲珑任务怎么做
  17. 更换一个已到使用寿命的墨盒--Epson
  18. 人工智能研究的内容:_更深入:人工智能研究的思想史
  19. Html5学习------canvas绘制径向渐变图形
  20. pvifa怎么用计算机算,年金现值系数表【完整版】

热门文章

  1. syslog源码_Gunicorn源码分析01--目录结构
  2. Solr安装(单机版)
  3. Linux下多节点SSH无密码互联实现
  4. (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功
  5. 实用JavaScript网页特效编程百宝箱pdf
  6. Xcode8.0 删除插件路径
  7. 最近开机老是弹出网银插件的问题
  8. 对 /sbin/nologin 的理解
  9. 字符串转json对象的各种方法
  10. Flash务实主义(五)——AS3的垃圾回收(转)