【发布时间】:2014-05-04 01:58:54
【问题描述】:
所以我有一个 4x16 的多维数组。我需要在 4x4 部分中按特定顺序访问它:
数组:
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]
访问路线:
1.
[00]
[03]
[02]
[01]
2.
[05]
[04]
[07]
[06]
3.
[10]
[09]
[08]
[11]
4.
[15]
[14]
[13]
[12]
5.
Repeat for next 4x4 block
产生的访问模式:
[00][05][10][15]
[04][09][14][03]
[08][13][02][07]
[12][01][06][11]
[16][21][26][31]
[20][25][30][19]
[24][29][18][23]
[28][17][22][27]
[32][37][42][47]
[36][41][46][35]
[40][45][34][39]
[44][33][38][43]
[48][53][58][63]
[52][57][62][51]
[56][61][50][55]
[60][49][54][59]
现在,我还想以四个点为一组访问这些,如上所示,我还想先看看会访问什么,所以我写了这个:
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
void main (void) {
int m;
int n;
const int h = 16;
const int w = 4;
int skip;
int x, y;
// ABCD
// BCDA
// CDAB
// DABC
// ABCD
// 0 => [0,0][3,1][2,2][1,3]
// 1 => [1,0][0,1][3,2][2,3]
// 2 => [2,0][
for (x = 0; x < h; x++) {
for (y = 0; y < w; y++) {
m = w - ((x + y) % w);
n = x + m;
printf ("[%i,%i]", ((x + y)), n);
}
printf ("\n");
}
return;
}
当它运行时,我想得到以下输出:
[r,c][r,c][r,c][r,c] (Group 0)
[r,c][r,c][r,c][r,c] (Group 1)
...
例如:
第 0 组和第 1 组
[0,0][3,1][2,2][1,3]
[1,0][0,1][3,2][2,3]
...
第 5 组和第 6 组
[5,0][4,1][7,2][6,3]
[6,0][5,1][4,2][7,3]
等等。
但是,我得到的输出是:
[0,4][1,3][2,2][3,1]
[1,4][2,3][3,2][4,5]
[2,4][3,3][4,6][5,5]
[3,4][4,7][5,6][6,5]
[4,8][5,7][6,6][7,5]
[5,8][6,7][7,6][8,9]
[6,8][7,7][8,10][9,9]
[7,8][8,11][9,10][10,9]
[8,12][9,11][10,10][11,9]
[9,12][10,11][11,10][12,13]
[10,12][11,11][12,14][13,13]
[11,12][12,15][13,14][14,13]
[12,16][13,15][14,14][15,13]
[13,16][14,15][15,14][16,17]
[14,16][15,15][16,18][17,17]
[15,16][16,19][17,18][18,17]
我怎样才能得到上面描述的输出?
注意:
我知道我可以使用查找表,但之后我要将其扩展为 256x4096 多维数组,所以查找表会太大。
【问题讨论】:
-
好问题。您的
256 x 4096多维数组是否也包含4 x 4s? -
不,它将由 256x256 组成 :)
标签: c algorithm math multidimensional-array output