代码之家  ›  专栏  ›  技术社区  ›  masfenix

将switch语句转换为更优雅的解决方案

  •  2
  • masfenix  · 技术社区  · 16 年前

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

       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 
    

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

        5 4 4 
        2 8 1 
        6 4 7 
    

    如果你注意到了,这是9 x 9的中心矩阵。如果你知道我的意思的话,我把所有的东西都分成了3对。第一行是0-3,第二行是3-6,第三行是6-9。 我希望这有道理 ( 我愿意采取其他方法来解决这个问题)

    不管怎样,这是我的密码。我真的不喜欢这种方式,即使它有效。但我想要速度,因为我正在做一个数独解算器。

        //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;
        }
    
    3 回复  |  直到 16 年前
        1
  •  7
  •   Stefan Kendall    16 年前

    除非我错过了什么,为什么不做数学呢?首先,只有商店 rowBegin 和 colBegin .

    现在,只需发布:

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

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

    现在,你从 科尔贝京 到 colBegin + 3 和 行开始 到 rowBegin + 3 . 你的默认行为真的有必要吗?如果是,特殊情况下 rnum < 1 || rnum > 3 和 qnum < 1 || qnum > 3

        2
  •  1
  •   Ignacio Vazquez-Abrams    16 年前

    在python中,此方法的常见模式是使用 dict 要映射:

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

    我相信C支持类似的东西。

        3
  •  0
  •   Stewart Johnson    16 年前

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

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

    当然,您可以将这些想法结合起来,在init()函数中预先计算答案,然后将它们存储在一个映射中。