我有一个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”。第一个“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;
}
答案 0 :(得分:7)
除非我遗漏了什么,否则为什么不做数学?所有的拳头,只存储rowBegin
和colBegin
。
现在,只需发出:
rowBegin = (rnum-1)*3
colBegin = (qnum-1)*3
这映射1 - &gt; 0,2 - &gt; 3,和3-> 6。
现在,您从colBegin
循环到colBegin + 3
,从rowBegin
循环到rowBegin + 3
。您的默认行为真的有必要吗?如果是,则在rnum < 1 || rnum > 3
和qnum < 1 || qnum > 3
答案 1 :(得分:1)
Python中的常见模式是使用dict来映射:
qmap = {
1: (0, 3),
2: (3, 6),
3: (6, 9),
}
print qmap.get(qnum, (0, 0))
我确信C#支持类似的东西。
答案 2 :(得分:0)
对于一般解决方案(即:NxN网格),我会使用一些数学(你需要模运算符)。
如果您总是使用9x9数独网格,那么您可以预先计算答案并将它们粘贴在地图或数组中。
当然,您可以将这些想法结合起来并在init()函数中预先计算答案,然后将它们存储在地图中。