2012蓝桥杯省赛第五题 转方阵(矩阵倒置)

来源:互联网 发布:windows激活不可用 编辑:程序博客网 时间:2024/06/15 01:10

 对一个方阵转置,就是把原来的行号变列号,原来的列号变行号

    例如,如下的方阵:

 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

    下面的代码实现的功能就是要把一个方阵顺时针旋转。

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("\n");}return 0;}
答案:

(1)rank*rank*sizeof(int)

(2) (i%4)*4+3-i/4

第一步无可厚非,就是开一个和原本矩阵大小相同的数组而已,第二步变换如下

矩阵的普通的倒置x[j][i]=x[i][j];

顺时针倒置是x[j][3-i]=x[i][j];

此处还要讲i转化两个坐标,即:x[i]->x[i/4][i%4]

那么,通过顺时针倒置,则有 x[i%4][3-i/4]=x[i/4][i%4]=x[i]

即:x[(i%4)*4+3-i/4]=x[i];



原创粉丝点击