认为:
2D array: abcdef
ghijkl
mnopqr
存储在长度宽度 * 高度的简单字符串中,因此,我们称之为 arr。
arr = abcdefghijklmnopqr
width = 6
height = strlen ( arr ) / width
目标是将此数组旋转 45 度 ( PI/4 ) 并获得以下结果:
arr = abgchmdinejofkplqr
width = 3
height = 8
converted to 2D array: a..
bg.
chm
din
ejo
fkp
.lq
..r
我花了几个小时试图弄清楚如何进行这种转换并提出了一些半功能解决方案,但我无法让它完全正常工作。你能描述/写一个算法来解决这个问题吗?最好在 C.
谢谢你的帮助
编辑:这是我已经尝试过的编辑
2:45度旋转的目的是将对角线变成线,以便可以使用strstr搜索它们。
// this is 90 degree rotation. pretty simple
for ( i = 0; i < width * height; i++ ) {
if ( i != 0 && !(i % height) ) row++;
fieldVertical[i] = field[( ( i % height ) * width ) + row];
}
// but I just can't get my head over rotating it 45 degrees.
// this is what I've tried. It works untile 'border' is near the first edge.
row = 0;
int border = 1, rowMax = 0, col = 0; // Note that the array may be longer
// than wider and vice versa. In that case rowMax should be called colMax.
for ( i = 0; i < width * height; ) {
for ( j = 0; j < border; j++, i++ ) {
fieldCClockwise[row * width + col] = field[i];
col--;
row++;
}
col = border;
row = 0;
border++;
}
我的代码中的“边界”是一个虚构的边界。在源代码中,它是分隔对角线的对角线。结果,它将是每行之间的水平线。
1 2 3 / 4 5
6 7 / 8 9 10
11 /12 13 14 15
那些斜线是我们的分界线。该算法应该非常简单,只需读取 riagonals:首先是数字 1,然后是 2,然后是 6,然后是 3,然后是 7,然后是 11,然后是 4,依此类推。