2012年第3回ブルーブリッジカップC/C++プログラム設計本科B組省試合方陣回転(コード埋め込み)
1777 ワード
2012年第3回ブルーブリッジカップC/C++プログラム設計本科B組省試合テーマまとめ:
http://blog.csdn.net/u014552756/article/details/50583827
かくれつかいてん 1つの行列に対して転置するのは、元の行番号を列番号に変更し、元の列番号を行番号に変更することです.例えば、次のような行列です. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16転置後:1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16しかし、この行列を時計回りに回転(回転ではない)すると、13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4次のコードで実現される機能は、1つの方程式を時計回りに回転させることです.
構想:この問題の重点はマトリクス要素の位置の変化にある.割り当てが必要なメモリ領域を最初の空に埋め込むのは簡単です.2番目の空埋めは要素の新しい位置と古い位置の関数関係式で、実際には数学の問題です.
答え:sizeof(int)*rank*rank
(i % 4) * 4 + 3 - (i/4)
http://blog.csdn.net/u014552756/article/details/50583827
かくれつかいてん 1つの行列に対して転置するのは、元の行番号を列番号に変更し、元の列番号を行番号に変更することです.例えば、次のような行列です. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16転置後:1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16しかし、この行列を時計回りに回転(回転ではない)すると、13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4次のコードで実現される機能は、1つの方程式を時計回りに回転させることです.
void rotate(int* x, int rank)
{
int* y = (int*)malloc(___________________); //
for(int i=0; i<rank * rank; i++)
{
y[_________________________] = x[i]; //
}
for(i=0; i<rank*rank; i++)
{
x[i] = y[i];
}
free(y);
}
int main(int argc, char* argv[])
{
int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int rank = 4;
rotate(&x[0][0], rank);
for(int i=0; i<rank; i++)
{
for(int j=0; j<rank; j++)
{
printf("%4d", x[i][j]);
}
printf("
");
}
return 0;
}
構想:この問題の重点はマトリクス要素の位置の変化にある.割り当てが必要なメモリ領域を最初の空に埋め込むのは簡単です.2番目の空埋めは要素の新しい位置と古い位置の関数関係式で、実際には数学の問題です.
答え:sizeof(int)*rank*rank
(i % 4) * 4 + 3 - (i/4)
# include <stdio.h>
# include <stdlib.h>
void rotate(int* x, int rank)
{
int* y = (int*)malloc(sizeof(int) * rank * rank); //
int i;
for(int i=0; i<rank * rank; i++)
{
y[(i % 4) * 4 + 3 - (i / 4)] = x[i]; //
}
for(i=0; i<rank*rank; i++)
{
x[i] = y[i];
}
free(y);
}
int main(int argc, char* argv[])
{
int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int rank = 4;
rotate(&x[0][0], rank);
for(int i=0; i<rank; i++)
{
for(int j=0; j<rank; j++)
{
printf("%4d", x[i][j]);
}
printf("
");
}
return 0;
}