C语言_数组原地_顺时针旋转 90 度

给定题目

13.给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]
参考答案:
void rotate(int* matrix, int matrixRowSize, int matrixColSize){
...//补充函数,实现原地旋转功能
}
int main(){
	int a[3][3]={1,2,3,4,5,6,7,8,9};
	rotate(a[0],3,3);
	  
	int *p; 
	for(p=a[0];p<a[0]+9;p++) 
    { 
		
		if((p-a[0])%3==0) printf("\n"); 

		printf("%4d",*p); 
     } 
	return 0;
}

为了追求一般性: 跳出题目, 寻找一般性.

首先建立 5x5 数组

(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
(4,0) (4,1) (4,2) (4,3) (4,4)

顺时针旋转 90 度后

(4,0) (3,0) (2,0) (1,0) (0,0)
(4,1) (3,1) (2,1) (1,1) (0,1)
(4,2) (3,2) (2,2) (1,2) (0,2)
(4,3) (3,3) (2,3) (1,3) (0,3)
(4,4) (3,4) (2,4) (1,4) (0,4)

而建立 4x4 数组

(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
(3,0) (3,1) (3,2) (3,3)

顺时针旋转90度后

(3,0) (2,0) (1,0) (0,0)
(3,1) (2,1) (1,1) (0,1)
(3,2) (2,2) (1,2) (0,2)
(3,3) (2,3) (1,3) (0,3)

发现

偶奇数 构成的数组并没有造成结构上的不同, 
理论上无限数构组成包含  1x1 , 2x2 , 3x3,... 等等 数组.

现在 寻找 原元素 要对调的 靶元素

5x5 数组中

角(0,0)要和(0,4)对调
边(0,2)要和(2,4)对调
内角(1,1) 要和(1,3)对调
中心(2,2)不变

4x4 数组中

角(0,0)要和(0,3)对调
边(0,2)要和(2,3)对调
内角(1,1) 要和(1,2)对调
无中心中心不变

总结

偶数数组  没有中心  不需要保持中心元素不变
更重要  之间的差别 是 第一行与最后一行(第n行)  列与行相差 (n-1)
内一行(第2行与第n-1行)相差 (n-1-2)

所以重点是行    

当然从列来说理论上也是可行的, 有机会就试试看(2020年7月4日)
链接如此:
程序设计初想
因为重点是行, 所以先由行来确定行列需要相差的数
different=matrixRowSize-1-2*i;
元素在数组的位置由行决定

另一个想法是要传递的数乘10加上原值(有机会做)

通过

前一列是现一行, 而前一行加上 行差 就是 现一列

因为题目是行指针

所以  用了  
*(数组名  +   现一行*行数   +  现一列   )
*(数组名  +   前一行*行数   +  前一行+行差   )
*(数组名  +   (前一行+行差) *行数   +  前一行*行数+行差   )
*(数组名  +   ( 前一行*行数+行差) *行数   +  (前一行+行差) +行差   )
的方式  (可能有理解灰色地带, 看代码吧)

最终子程序

void rotate(int* matrix, int matrixRowSize, int matrixColSize){col=matrixColSize/2;

    //In order to make the array can be effectively executed when sorting odd and even arrays
    int num=matrixRowSize%2?col=col+1:0;

    //This is a displacement of four data in a cycle
    for(int i=0;i<matrixRowSize/2;i++){
        for(int j=0;j<col;j++){
            //int dif1=matrixRowSize-1-2*i;
            //matrixRowSize-1-2*i   *(matrix+matrixRowSize*j+different+i)  ==  *(matrix+matrixRowSize*j+matrixRowSize-1-i)
            int tmp=*(matrix+matrixRowSize*i+j);
            *(matrix+matrixRowSize*i+j)=*(matrix+(j+matrixRowSize-1-2*j)*matrixRowSize+(matrixRowSize-1-2*i+i)+matrixRowSize-1-2*(matrixRowSize-1-2*i+i));
            *(matrix+(j+matrixRowSize-1-2*j)*matrixRowSize+(matrixRowSize-1-2*i+i)+matrixRowSize-1-2*(matrixRowSize-1-2*i+i))=*(matrix+matrixRowSize*(matrixRowSize-1-2*i+i)+j+matrixRowSize-1-2*j);
            *(matrix+matrixRowSize*(matrixRowSize-1-2*i+i)+j+matrixRowSize-1-2*j)=*(matrix+matrixRowSize*j+matrixRowSize-1-2*i+i);
            *(matrix+matrixRowSize*j+matrixRowSize-1-2*i+i)=tmp;
        }
    }
}

修饰一下(不知道会不会增加程序阅读难度)

主要是把传递值的过程中多余的代数约掉罢了(我没完成)

最终程序

#include <stdio.h>

void rotate(int* matrix, int matrixRowSize, int matrixColSize){col=matrixColSize/2;

    //In order to make the array can be effectively executed when sorting odd and even arrays
    int num=matrixRowSize%2?col=col+1:0;

    //This is a displacement of four data in a cycle
    for(int i=0;i<matrixRowSize/2;i++){
        for(int j=0;j<col;j++){
            //int dif1=matrixRowSize-1-2*i;
            //matrixRowSize-1-2*i   *(matrix+matrixRowSize*j+different+i)  ==  *(matrix+matrixRowSize*j+matrixRowSize-1-i)
            int tmp=*(matrix+matrixRowSize*i+j);
            *(matrix+matrixRowSize*i+j)=*(matrix+(matrixRowSize-1-j)*matrixRowSize+(matrixRowSize-1-i)+matrixRowSize-1-2*(matrixRowSize-1-2*i+i));
            *(matrix+(j+matrixRowSize-1-2*j)*matrixRowSize+(matrixRowSize-1-2*i+i)+matrixRowSize-1-2*(matrixRowSize-1-2*i+i))=*(matrix+matrixRowSize*(matrixRowSize-1-2*i+i)+j+matrixRowSize-1-2*j);
            *(matrix+matrixRowSize*(matrixRowSize-1-2*i+i)+j+matrixRowSize-1-2*j)=*(matrix+matrixRowSize*j+matrixRowSize-1-2*i+i);
            *(matrix+matrixRowSize*j+matrixRowSize-1-2*i+i)=tmp;
        }
    }
}
int main(){
	int a[3][3]={1,2,3,4,5,6,7,8,9};
	rotate(a[0],3,3);
	  
	int *p; 
	for(p=a[0];p<a[0]+9;p++) 
    { 
		
		if((p-a[0])%3==0) printf("\n"); 

		printf("%4d",*p); 
     } 
	return 0;
}

感想

用了我三天时间, 看似很简单, 但是有许多想法都割掉了, 这也是第一次我写博客, 所以都挺新鲜的

我只是一只编程小白, 有什么想法大家可以讨论
  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值