代码编织梦想

一.有关题目

1.题目描述

Give you a n∗n matrix, if you rotate it 90 degrees(clockwise), we call it 1-Matrix, if you rotate it 180 degrees, we call it 2-Matrix, etc … This is said if you rotate the Matrix 90∗k degrees, then we call it k-Matrix. Now, your task is to calculate all the sum of i-Matrix (0<= i<= k).

(给定一个n*n阶的矩阵,如果你把它旋转90度(顺时针),我们就称之为1矩阵,如果你旋转180度,我们就称之为2矩阵,以此类推...这就是说如果你旋转90*k度,我们就称之为k矩阵。现在你的任务是计算所有i矩阵的和。)

2.输入描述

 There multiple test cases. Each test case begins with one integer n(1 <= n <= 10), following n lines, each line contains n integers, describe the original matrix, then a single line contains a k (1 <= k <= 10^8)described above. Process to end of file.

(有多个测试样例。每个样例以一个整数n(1<=n<=10),在这n行下面,每行包括n个整数,描述初始的矩阵,然后有单独一行包括k,描述上面的k,处理到文件末尾)

3.输出描述

For each case, output the sum of all the i-Matrix (0<= i<= k) in n lines. Each line there are n integers separated by one space. Note that there is no extra space at the end of each line.
(对于每个样例,在n行中输出所有n矩阵的和。每行有n个整数后面跟着一个空格。注意在每一行的最后不要有多余的空格)

4.样例输入
3

1 2 3

2 3 4

3 4 5

10

5.样例输出
33 32 31

34 33 32

35 34 33

二.题目解析

根据题目我们可以得到这是先把矩阵进行旋转然后对各个位置上的数字进行求和,比如在样例中,第一行第一列是1,旋转一次后第一行第一列是3,以此类推,11次(因为初始矩阵本身算一次所以是11次)分别是1,3,5,3,1,3,5,3,1,3,5加起来刚好是33所以输出的第一行第一列是33.

三.解题

根据前面的分析我们可以设定一个进行矩阵旋转的函数,每旋转一次就将旋转后的矩阵加在最后得到的那个矩阵上,而对于单纯的矩阵旋转,我们可以由三阶矩阵进行推广。对于一个三阶矩阵,旋转一次我们观察坐标的变化(1,1)变成(1,3),(1,2)变成(2,3),(1,3)变成(3,2)。。。以此类推我们可以得到变化前的纵坐标和变化后的横坐标是相等的,而变化前的横坐标加变化后的纵坐标加起来就是3也就是n,所以根据这样的规律我们可以编写出这个矩阵旋转的函数

void rotation(long long int a[][],int d)
{
	int p,q;
	long long int b[N][N]={0};
	for(p=0;p<d;p++)
	   for(q=0;q<d;q++)
	   {
	   	b[p][q]=a[d-1-q][p];
	   }
	   	for(p=0;p<d;p++)
	   for(q=0;q<d;q++)
	   {
	   	a[p][q]=b[p][q];
	   }
}

(其中的N为10,即n的最大值)

(这里要注意我们刚才分析的时候是变化前坐标在前面而变化后的坐标在后面,而在实际编写代码的时候,要输出的在前面,所以我们应该进行一个反向的处理)

有了这样的矩阵旋转函数我们就可以根据k的值进行旋转并加和了

这里提供两种办法

1.直接根据k的值进行循环相加

for(m=0;m<=k;m++)
    for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			y[i][j]+=x[i][j];
		}
	     	rotation(x,n);

(这样编写代码的时候在输出的时候是没有问题的,但是在我自己提交oj题目是,却出现了时间超出限制的问题,可能是由于k的值不确定可能引发数值过大的问题(自己也是小白也不是很理解))

2.第二种方法则是根据一种大循环套着小循环的思想来进行的,我们知道矩阵有四个角,所以每四次旋转就代表着一个大循环,所以我们可以根据这一点来编写代码

for(m=1;m<=4;m++)
 {
   rotation(x,n);
    for(i=0;i<n;i++)
	  for(j=0;j<n;j++)
		 y[i][j]+=x[i][j];
  }
  for(i=0;i<n;i++)
	for(j=0;j<n;j++)
	   y[i][j]=(k/4)*y[i][j];
for(m=1;m<=(k%4);m++)
    {
	 rotation(x,n);
      for(i=0;i<n;i++)
	 	 for(j=0;j<n;j++)
		     y[i][j]+=x[i][j];
       }

首先先把一个循环的加和算出来,然后再根据有几个这样的四组(即k/4)来乘前面所得到的结果,最后把除去四的倍数的次数循环(即k%4)加上就得到了最终的结果.

最后把结果输出出来

	for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				printf("%lld ",y[i][j]+z[i][j]);
			}
			printf("\n");
		}
	}

注意最后的结果要加上第一次尚未进行旋转的矩阵,因为题目描述中说到0就是对矩阵不做旋转,这个也要加上。

最后加上其他的一些东西就组成了最终的代码

#include<stdio.h>
#define N 10
void rotation(long long int a[][10],int d);
int main()
{
	int n;
	while((scanf("%d",&n))!=EOF)
	{
		int k;
		long long int x[N][N]={0};
		long long int y[N][N]={0};
		long long int z[N][N]={0}; //这里要对x和n初始化不然会输出奇怪的数字 
		int i=0,j=0;
		int m=0;
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				scanf("%lld",&x[i][j]);
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				z[i][j]=x[i][j];
			}
		}
		scanf("%d",&k);
        for(m=1;m<=4;m++)
        {
        	rotation(x,n);
        	for(i=0;i<n;i++)
			   for(j=0;j<n;j++)
			      y[i][j]+=x[i][j];
        }
        for(i=0;i<n;i++)
	        for(j=0;j<n;j++)
		       y[i][j]=(k/4)*y[i][j];
		       for(m=1;m<=(k%4);m++)
       {
	        rotation(x,n);
         	for(i=0;i<n;i++)
	 	         for(j=0;j<n;j++)
		      	    y[i][j]+=x[i][j];
       }
			for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				printf("%lld ",y[i][j]+z[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}
void rotation(long long int a[][10],int d)
{
	int p,q;
	long long int b[N][N]={0};
	for(p=0;p<d;p++)
	   for(q=0;q<d;q++)
	   {
	   	b[p][q]=a[d-1-q][p];
	   }
	   	for(p=0;p<d;p++)
	   for(q=0;q<d;q++)
	   {
	   	a[p][q]=b[p][q];
	   }
}

新人分享,希望大家多提建议,大家共同学习,一起进步。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdlwlsy/article/details/129677935

leetcode oj 之 rotate image (旋转图像)-爱代码爱编程

题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 给一个n x n的矩阵代表一个图像,顺时针旋转这个图像9

soj.旋转矩阵-爱代码爱编程

旋转矩阵    总提交数量:14通过数量:10          

南邮 oj 1183 蛇形矩阵-爱代码爱编程

蛇形矩阵 时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 489            测试通过 : 68  比赛描述 给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中

九度oj题目1164:旋转矩阵解题报告-爱代码爱编程

题目1164:旋转矩阵 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4322 解决:1668 题目描述: 任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角

九度oj-题目1164:旋转矩阵-模拟-爱代码爱编程

题目链接:http://ac.jobdu.com/problem.php?pid=1164 题目描述: 任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如

hrbust oj题目_旋转mu马的博客-爱代码爱编程_hrbustoj

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

矩阵的转置和旋转_ji_r的博客-爱代码爱编程_旋转矩阵的转置

转置: 转置很简单的,就是a[i][j] -- > a[j][i]即可。可以开辟一个新的二维数组。b[i][j] = a[j][i]即可。 例题:输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。 此时应该怎么办呢?只要根据题目要求,直接输出就可以啦!(解释一下,为什么我的输出部分要写成下面这样,把最后一列单独输出出来, 那是

OJ题解汇总-爱代码爱编程

背景: 在很长一段时间内,我都是保持着一个题目一篇博客的习惯。 当博客数量超过1600之后,我开始对博客进行合并梳理。 这个梳理主要是内容的总结,而不是分类,我的博客一直都是分类非常细致的。 以前每一个OJ题解都可以搜索博客标题搜出来,现在由于合并了,就没有这个便利了。 为此,我写了本博客,用来导航我所有的OJ题解 本文更新规则: (1)新增

旋转的矩阵-爱代码爱编程

旋转的矩阵 题目描述 题目描述 给定一个n*m的矩阵,请以顺、逆时针交替旋转的方式打印出每个元素。 Input Format 第一行n m; 0<n,m<100 后n行,每行m个整数。 Output Format n*m个矩阵元素,空格隔开。 ExampleInput 4 4 1 2 3 4 12 13 16