【问题标题】:Converting switch statements to more elegant solution将 switch 语句转换为更优雅的解决方案
【发布时间】:2010-03-20 01:40:34
【问题描述】:

我有一个 9 x 9 矩阵。 (想想数独)。

   4 2 1 6 8 1 8 5 8 
   3 1 5 8 1 1 7 5 8 
   1 1 4 0 5 6 7 0 4 
   6 2 5 5 4 4 8 1 2 
   6 8 8 2 8 1 6 3 5 
   8 4 2 6 4 7 4 1 1 
   1 3 5 3 8 8 5 2 2 
   2 6 6 0 8 8 8 0 6 
   8 7 2 3 3 1 1 7 4 

现在我想获得一个“象限”。例如(根据我的代码) quadrant 2 , 2 返回以下内容:

    5 4 4 
    2 8 1 
    6 4 7 

如果您注意到了,这是 9 x 9 最中心的矩阵。如果您知道我的意思,我已将所有内容分成一对“3”。第一个“ROW”是 0 - 3,第二个是 3 - 6,第三个是 6 - 9.. 我希望这是有道理的我愿意接受其他方式关于这个)

无论如何,这是我的代码。我真的不喜欢这种方式,即使它有效。我确实想要速度,因为我正在制作一个 suduko 求解器。

    //a quadrant returns the mini 3 x 3
    //row 1  has three quads,"1", "2", 3"
    //row 2  has three quads "1", "2", "3" etc
    public int[,] GetQuadrant(int rnum, int qnum) {
        int[,] returnMatrix = new int[3, 3];
        int colBegin, colEnd, rowBegin, rowEnd, row, column;

        //this is so we can keep track of the new matrix
        row = 0;
        column = 0;      
        switch (qnum) {
            case 1:
                colBegin = 0;
                colEnd = 3;
                break;
            case 2:
                colBegin = 3;
                colEnd = 6;
                break;
            case 3:
                colBegin = 6;
                colEnd = 9;
                break;
            default:
                colBegin  = 0;
                colEnd = 0;
                break;
        }

        switch (rnum) {
            case 1:
                rowBegin = 0;
                rowEnd = 3;
                break;
            case 2:
                rowBegin = 3;
                rowEnd = 6;
                break;
            case 3:
                rowBegin = 6;
                rowEnd = 9;
                break;
            default:  
                rowBegin = 0;
                rowEnd = 0;
                break;
        }
        for (int i = rowBegin ; i < rowEnd; i++) {
            for (int j = colBegin; j < colEnd; j++) {                 
                returnMatrix[row, column] = _matrix[i, j];
                column++;
            }
            column = 0;
            row++;
        }
        return returnMatrix;
    }

【问题讨论】:

    标签: c# matrix switch-statement


    【解决方案1】:

    除非我错过了什么,否则为什么不做数学呢?首先,只存储rowBegincolBegin

    现在,只需发出:

    rowBegin = (rnum-1)*3
    colBegin = (qnum-1)*3
    

    这映射 1 -> 0、2 -> 3 和 3-> 6。

    现在,您从colBegin 循环到colBegin + 3,然后从rowBegin 循环到rowBegin + 3。你的默认行为真的有必要吗?如果是,则为rnum &lt; 1 || rnum &gt; 3qnum &lt; 1 || qnum &gt; 3 时的特殊情况

    【讨论】:

    • 哇,谢谢。。我想了很久。考虑到我是一名本科数学学生并且无法接受这种模式,这有点令人难过。 :P
    • 我应该知道你有数学背景。您将左上角(或左下角)称为(1,1)而不是(0,0)。疯狂!
    • 我试图进一步概括这一点。我将不接收坐标类型点,而是将其传递一个 1 - 9 的数字。其中 1 2 3 是两行,4、5、6,从第二行开始,依此类推。
    • 这不是数学,而是算术。
    【解决方案2】:

    这在 Python 中的常见模式是使用 dict 来映射:

    qmap = {
      1: (0, 3),
      2: (3, 6),
      3: (6, 9),
    }
    
    print qmap.get(qnum, (0, 0))
    

    我确信 C# 支持类似的东西。

    【讨论】:

      【解决方案3】:

      对于一般解决方案(即:NxN 网格),我会使用一些数学运算(您需要模运算符)。

      如果您一直使用 9x9 数独网格,那么您可以预先计算答案并将它们粘贴到地图或数组中。

      当然,您可以结合这些想法并在 init() 函数中预先计算答案,然后将它们存储在地图中。

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 2011-02-13
        • 2020-07-30
        • 2011-02-05
        • 2011-04-18
        相关资源
        最近更新 更多