矩阵旋转(C语言)

有一个NxN整数矩阵,旋转一次为90度,矩阵既可以顺时针旋转也可以逆时针旋转。

现在给定一个NxN的矩阵、矩阵的阶数N和矩阵旋转次数k,k为负数时,代表矩阵逆时针旋转的次数,k为正数时,代表矩阵顺时针旋转次数。

请输出旋转后的NxN矩阵。

数据范围:0 < n <300,矩阵中的值满足 0 <val<1000

输入格式:

输入第一行矩阵阶数n,旋转次数k;

第二行矩阵中的各个元素

输出格式:

输出旋转后的矩阵,每个元素后面都有一个空格

输入样例:

在这里给出一组输入。例如:

3 1
1 2 3
4 5 6
7 8 9

输出样例:

在这里给出相应的输出。例如:

7 4 1 
8 5 2 
9 6 3 

 思路:矩阵经过旋转后的结果,可以把原矩阵按照不同方向和方法进行打印而得到

原矩阵:
1 2 3
4 5 6
7 8 9
旋转90度:(一次)其实是把原矩阵按列为外层循环(由小到大),按行为内层循环(由大到小)遍历
7 4 1
8 5 2
9 6 3
旋转180度:(二次)其实是把原矩阵按列为外层循环(由大到小),按列为内层循环(由大到小)遍历
9 8 7
6 5 4
3 2 1
旋转270度:(三次)其实是把原矩阵按列为外层循环(由大到小),按行为内层循环(由小到大)遍历
3 6 9
2 5 8
1 4 7
旋转360度:(四次)
1 2 3
4 5 6
7 8 9

逆时针旋转后的结果与上述顺时针旋转结果一致(并不一一对应)

 

#include<stdio.h>
int main()
{
	int n,k,data[301][301];
	scanf("%d%d",&n,&k);  //矩阵的阶数,和旋转的次数 
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&data[i][j]);
		}
	}
		k%=4;
		if(k==0)   //旋转四次以后与原矩阵相同 
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					printf("%d ",data[i][j]);
				}
				printf("\n");
			}	
		}
		else if(k==1||k==-3)     //顺时针旋转1次与逆时针旋转3次一致 
		{
			for(int j=0;j<n;j++)
			{
				for(int i=n-1;i>=0;i--)
				{
					printf("%d ",data[i][j]);
				}
				printf("\n");
			}			
		}
		else if(k==2||k==-2)    //顺时针旋转2次与逆时针旋转两次一致 
		{
			for(int i=n-1;i>=0;i--)
			{
				for(int j=n-1;j>=0;j-- )
				{
					printf("%d ",data[i][j]);
				}
				printf("\n");
			}				
		}
		else if(k==-1||k==3)    //顺时针旋转三次与逆时针旋转一次相同 
		{
			for(int j=n-1;j>=0;j--)
			{
				for(int i=0;i<n;i++ )
				{
					printf("%d ",data[i][j]);
				}
				printf("\n");
			}				
		}

}

 

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值