蓝桥杯 第三届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

posted @ 2014-03-12 20:11  Freecode#  阅读(398)  评论(0编辑  收藏  举报