所以我转换了一个2D矩阵:
int m[10][10];
int i, j, tmp;
main ()
{
// inlezen van de matrix
for (i=0; i<10; i++)
for (j=0; j<10; j++)
m[i][j] = getint();到1D:
int M[10*10];
int i, j, tmp;
int k, h;
main ()
{
// inlezen van de matrix
for (i=0; i<10; i++)
for (j=0; j<10; j++) {
k = 10 * j + i;
M[k] = getint();
}最后,我们必须转换这段代码,这样它才能为我们的1D数组提供功能:
// voer complexe bewerking uit op de matrix
for (i=0; i<10; i++)
for (j=5; j<15; j++)
m[i][j-5] += m[9-i][14-j];
... // Druk de matrix af
}这本书是这样写的:
for (i=0; i<10; i++)
for (j=5; j<15; j++) {
k = 10 * j + i - 50; // 10*(j-5) + i = 10*j + i - 50
h = 149 - 10 * j - i // 10*(14-j) + (9-i) =
// 140 - 10*j + 9 - i = 149 - 10*j - i
M[k] += M[h];
}不过,我的解决办法是,
for (k = 0; k < 100; k++)
M[k] += M[99-k]我想知道我的解决方案是否也是正确的,因为上面所有的代码都是添加对称元素。所以可以用我的公式来简化,对吧?
提前感谢你的帮助。
发布于 2019-10-31 09:58:45
根据这本书的代码,索引如下:
[k] [h]
[99][0] [89][10] [79][20] [69][30] [59][40] [49][50] [39][60] [29][70] [19][80] [9][90]
[98][1] [88][11] [78][21] [68][31] [58][41] [48][51] [38][61] [28][71] [18][81] [8][91]
[97][2] [87][12] [77][22] [67][32] [57][42] [47][52] [37][62] [27][72] [17][82] [7][92]
[96][3] [86][13] [76][23] [66][33] [56][43] [46][53] [36][63] [26][73] [16][83] [6][93]
[95][4] [85][14] [75][24] [65][34] [55][44] [45][54] [35][64] [25][74] [15][84] [5][94]
[94][5] [84][15] [74][25] [64][35] [54][45] [44][55] [34][65] [24][75] [14][85] [4][95]
[93][6] [83][16] [73][26] [63][36] [53][46] [43][56] [33][66] [23][76] [13][86] [3][96]
[92][7] [82][17] [72][27] [62][37] [52][47] [42][57] [32][67] [22][77] [12][87] [2][97]
[91][8] [81][18] [71][28] [61][38] [51][48] [41][58] [31][68] [21][78] [11][88] [1][98]
[90][9] [80][19] [70][29] [60][39] [50][49] [40][59] [30][69] [20][79] [10][89] [0][99] 所以答案是肯定的。要减少循环次数,可以尝试:
for (i=0; i<50; i++){
k = 50 - i;
h = i + 50;
tmp = M[k];
M[k] += M[h];
if (i != 0) M[h] += tmp; //No not sum twice [50]
}发布于 2019-10-31 10:02:48
是的,你是对的。
通过几个中间转换可以更简单地看到:
从以下方面开始:
for (i=0; i<10; i++)
for (j=5; j<15; j++) {
k = 10 * j + i - 50;
h = 149 - 10 * j - i;
M[k] += M[h];
}更改为更常见的j值范围使其更简单:
for (i=0; i<10; i++)
for (j=0; j<10; j++) { //subtract 5 from j here
k = 10 * j + i; //so add 50 to compensate here
h = 99 - 10 * j - i; //and subtract 50 to compensate here
M[k] += M[h];
}然后再使用k:
for (i=0; i<10; i++)
for (j=0; j<10; j++) {
k = 10 * j + i;
h = 99 - k; //substitute 10j+i => k
M[k] += M[h];
}那么很简单就可以看出这相当于
for (k=0; i<100; k++) {
M[k] += M[99-k];
}当然,你已经知道这一点,但也许上面的情况更清楚地证明了这一点。
https://stackoverflow.com/questions/58639995
复制相似问题