• 蓝桥杯 第三届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("
    ");
    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("
    ");
    38     }
    39 
    40     return 0;
    41 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    前端解决跨域问题的8种方案(最新最全)
    javascript中“use strict”的好处和坏处
    转载 :请描述一下 cookies,sessionStorage 和 localStorage 的区别?
    七天学会nodejs
    js中的类、继承、闭包
    转:浏览器内核、渲染引擎、js引擎
    html中position定位问题
    html浏览器的兼容问题
    css命名规则
    搭建keepalived遇到的问题
  • 原文地址:https://www.cnblogs.com/yym2013/p/3597175.html
Copyright © 2020-2023  润新知