仮定する:
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
それらのスラッシュは私たちの境界線です。アルゴリズムは非常に単純で、最初の数字が1、次に2、次に6、次に3、次に7、次に11、次に4というように三角形を読み取る必要があります。