蓝桥杯 第三届C/C++预赛真题(5) 转方阵(C基本功)
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号
例如,如下的方阵:
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)
2 {
3 int* y = (int*)malloc(___________________); // 填空
4
5 for(int i=0; i<rank * rank; i++)
6 {
7 y[_________________________] = x[i]; // 填空
8 }
9
10 for(i=0; i<rank*rank; i++)
11 {
12 x[i] = y[i];
13 }
14
15 free(y);
16 }
17
18 int main(int argc, char* argv[])
19 {
20 int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
21 int rank = 4;
22
23 rotate(&x[0][0], rank);
24
25 for(int i=0; i<rank; i++)
26 {
27 for(int j=0; j<rank; j++)
28 {
29 printf("%4d", x[i][j]);
30 }
31 printf("\n");
32 }
33
34 return 0;
35 }
水题,考验C的基本功。
没什么好说的,自己在演草纸上验算一遍,就能发现矩阵映射规律。
x[i] 转换成二维坐标是 x[i/rank][i%rank]。它应该放到y的 y[i%rank][rank-i/rank-1] 位置。
转换成一维坐标就是 y[(i%rank)*rank+rank-i/rank-1]。
注意:1、a[i][j]可以用a[i*n+j]表示,n表示方阵的阶数。2、malloc()函数中要加上sizeof(int)。
答案:
sizeof(int)*rank*rank
(i%rank)*rank+rank-i/rank-1
代码:
1 #include <iostream>
2 #include <malloc.h>
3 #include <stdio.h>
4 using namespace std;
5
6 void rotate(int* x, int rank)
7 {
8 int* y = (int*)malloc(sizeof(int)*rank*rank); // 填空
9
10 int i;
11 for(i=0; i<rank * rank; i++)
12 {
13 y[(i%rank)*rank+rank-i/rank-1] = x[i]; // 填空
14 }
15
16 for(i=0; i<rank*rank; i++)
17 {
18 x[i] = y[i];
19 }
20
21 free(y);
22 }
23
24 int main(int argc, char* argv[])
25 {
26 int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
27 int rank = 4;
28
29 rotate(&x[0][0], rank);
30
31 for(int i=0; i<rank; i++)
32 {
33 for(int j=0; j<rank; j++)
34 {
35 printf("%4d", x[i][j]);
36 }
37 printf("\n");
38 }
39
40 return 0;
41 }
Freecode : www.cnblogs.com/yym2013