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つの方程式を時計回りに回転させることです.
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; }