不用其他数组,将已知方阵顺时针、逆时针旋转90°

题目描述:不使用其他数组,将下列4阶方阵顺时针、逆时针旋转90°

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

要求输出:

CW:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
CCW:
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13

这个方阵是用一个二维数组存放的,由于不能使用其他数组,所以我们能做的操作就是将某两个元素位置交换。要做到顺时针旋转,观察数的位置,可以先按对角线交换,然后进行左右交换,即a[i][j]与a[j][i]互换,然后a[i][j]与a[i][n-j]互换,这里的n应该是方阵的阶数减一(此题为3)。

当完成一次顺时针旋转,再观察数的位置,可知只要再对所有元素进行一次中心对称的交换,就可以实现原方阵的逆时针旋转。完整代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int mat[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };//输入数组
	printf("Origin:\n");
	printf("1 2 3 4\n5 6 7 8 \n9 10 11 12\n13 14 15 16\n");
	int temp=0,i,j;
	for (i = 0; i <= 3; i++)    //关于对角线交换位置
		for (j = 0; j <= i; j++)
		{
			temp = mat[i][j];
			mat[i][j] = mat[j][i];
			mat[j][i] = temp;
		}
	for(i=0;i<=3;i++)      //关于中心对称轴交换
		for(j=0;j<=1;j++)
		{
			temp = mat[i][j];
			mat[i][j] = mat[i][3 - j];
			mat[i][3 - j] = temp;
		}
	printf("CW:\n");     //第一次输出
	for (i = 0; i <= 3; i++)
		for (j = 0; j <= 3; j++)
		{
			printf("%d ", mat[i][j]);
			if (j == 3)
				printf("\n");
		}
	for (i = 0; i <= 3; i++)     //关于对称中心交换位置
		for (j = 0; j <= 1; j++)
		{
			temp = mat[i][j];
			mat[i][j] = mat[3 - i][3 - j];
			mat[3 - i][3 - j] = temp;
		}
	printf("CCW:\n");        //第二次输出
	for (i = 0; i <= 3; i++)
		for (j = 0; j <= 3; j++)
		{
			printf("%d ", mat[i][j]);
			if (j == 3)
				printf("\n");
		}
	return 0;
}

对于其他方阵,此方法也是适用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值