• 方阵旋转蓝桥杯


    欢迎访问我的新博客:http://www.milkcu.com/blog/

    原文地址:http://www.milkcu.com/blog/archives/1366854420.html

    简述

    这是2012年蓝桥杯全国软件大赛预赛(C++本科组)第5题,问题是矩阵的旋转。

    推荐链接:《2012蓝桥杯软件大赛预赛题目汇总》

    题目描述

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

        例如,如下的方阵:
     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;
    }
    

    请分析代码逻辑,并推测划线处的代码。
    答案写在 “解答.txt” 文件中
    注意:只写划线处应该填的内容,划线前后的内容不要抄写。

    分析

    该题的重点就在矩阵元素位置的改变。第一空填入需要分配的内存空间,较简单;第二空填的是元素新位置和旧位置的函数关系式,实际是个数学问题。

    源代码

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

    最后答案

    sizeof(int) * rank * rank
    (i % 4) * 4 + 3 - (i / 4)
  • 相关阅读:
    mssql 2008 数据库可疑
    sss
    css 浏览器兼容 重置代码
    .net 接口与 foreach必要条件
    .net获取ip
    flash与js的通信
    WebService传输文件的几个知识点
    【前端】深入浅出Javascript中的数值转换
    [前端]代理知识入门介绍
    Hello 博客园! ---致我人生中的第一篇随笔
  • 原文地址:https://www.cnblogs.com/milkcu/p/3808914.html
Copyright © 2020-2023  润新知