首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将开关语句转换为更优雅的解决方案

将开关语句转换为更优雅的解决方案
EN

Stack Overflow用户
提问于 2010-03-20 01:40:34
回答 3查看 443关注 0票数 2

我有9x9矩阵。(想想suduko)。

代码语言:javascript
运行
复制
   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返回以下内容:

代码语言:javascript
运行
复制
    5 4 4 
    2 8 1 
    6 4 7 

如果你注意到了,这就是9x9中心的矩阵,如果你知道我的意思的话,我把所有的东西都分解成一对"3“。第一行是0-3,第二排是3-6,第三排是6-9。--我希望这是有意义的,(我对其他的方法持开放态度)

不管怎样,这是我的密码。我不太喜欢这种方式,尽管它很管用。我确实想要速度,因为我正在做一个suduko的解算器。

代码语言:javascript
运行
复制
    //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;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-20 01:46:07

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

现在,只需发布:

代码语言:javascript
运行
复制
rowBegin = (rnum-1)*3
colBegin = (qnum-1)*3

这个映射1 -> 0,2 -> 3和3-> 6.

现在,循环从colBegincolBegin + 3,从rowBegin循环到rowBegin + 3。你的默认行为真的有必要吗?如果是的话,特例是rnum < 1 || rnum > 3qnum < 1 || qnum > 3

票数 7
EN

Stack Overflow用户

发布于 2010-03-20 01:45:41

在Python中,常见的模式是使用字典映射:

代码语言:javascript
运行
复制
qmap = {
  1: (0, 3),
  2: (3, 6),
  3: (6, 9),
}

print qmap.get(qnum, (0, 0))

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

票数 1
EN

Stack Overflow用户

发布于 2010-03-20 01:54:38

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2481565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档