关于一个最简单的数独解题实现与疑惑

一、缘起

  之前买了一本《算法的乐趣》,这么多日子里根本没看过。我可能是一个书籍的收藏者而不是读者,因为在办公室里的书架上琳琅满目的摆放了几十本书了,可所读者寥寥无几!言归正传,偶然看了这本书中关于数独的章节,觉得有意思,但书中代码不全,所以自己动手试试,看看能不能按照原作者的思路把这个问题解决了。

 二、编码

  1、首先说我自己是一个非常业余的编程爱好者,既不是本专业,也不从事相关工作,所以代码中肯定有很多乱七八糟的写法,如果有人看到后想揍人,那么。。。。。。

        /// <summary>
        /// 关于单元格的类
        /// </summary>
        [Serializable]
        public class SudokuCell
        {
            public int num;        // 该单元格的值
            public bool isFixed;   // 该单元格是否是确定的数值
            public List<int> candidatures ;  // 候选数列表
            public SudokuCell()
            {
                candidatures = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  // 候选数列表
            }
        }    

  这里的思想是这样的,对于数独游戏而言(这里只考虑9*9),有81个格子。每个格子,可以认为是一个单元格。这里用SudokuCell这个类来表示,同时,用一个候选数列表来表示该单元格还可以填入的数字。

  2、再定义一个关于整个盘面的类,表示数独游戏自身,因为内容较多,我分开来写

     /// <summary>
        /// 关于整个盘面的类
        /// </summary>
        [Serializable]
        public class SudokuGame
        {
        ......  
     }

  2.1、SudokuGame类中,定义几个数据成员

      // 定义单元格数组,表示81个单元格
         public SudokuCell[,] cells = new SudokuCell[9,9];
         // 记录已经确认的单元格的数量,就是那些数字已经确认无误的单元格的数量
         public int fixedCount;

  2.2、构造函数

            /// <summary>
            /// 构造函数,自己给了一个局面
            /// </summary>
            public  SudokuGame()
            {
                int[] data = new int[] {
                    7,6,1,0,3,0,0,2,0,
                    0,5,0,0,0,8,1,0,7,
                    0,0,0,0,0,7,0,3,4,
                    0,0,9,0,0,6,0,7,8,
                    0,0,3,2,7,9,5,0,0,
                    5,7,0,3,0,0,9,0,2,
                    1,9,0,7,6,0,0,0,0,
                    8,0,2,4,0,0,0,6,0,
                    6,4,0,0,1,0,2,5,0
                };
for (int i = 0; i < 81; i++) { int num = data[i]; // 单个的值 cells[i / 9, i % 9] = new SudokuCell(); cells[i / 9, i % 9].num = num; // 这里,把给定的盘面复制到cells中 if (num != 0) { cells[i / 9, i % 9].isFixed = true; fixedCount++; } } }

  2.3、最终盘面输出

 1             /// <summary>
 2             ///  输出得到的结果
 3             /// </summary>
 4             public void WriteResult()
 5             {
 6                 Console.WriteLine("当前的fixedCount为:{0},局面为:",fixedCount);
 7                 // 这里因为已知是9*9的数组
 8                
 9                 for (int i = 0; i < 9; i++)
10                 {
11                     for (int j = 0; j < 9; j++)
12                     {
13                         string s = cells[i, j].num.ToString();
14                         Console.Write(s + " ");
15                     }
16                     // 输出换行
17                     Console.WriteLine();    
18                 }
19             }

未完待续

  

猜你喜欢

转载自www.cnblogs.com/punisherCN/p/9880869.html