如何将1个矩阵旋转90度

执假以为真 2008-09-04 11:15:53
如何将1个矩阵旋转90度,如:
1 2 3 7 4 1
4 5 6 -> 8 5 2
7 8 9 9 6 3

矩阵若想不出来,就想想方阵吧
...全文
4038 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
k_zheng 2011-09-05
  • 打赏
  • 举报
回复
sefule的解法对3×3的矩阵来说是没问题的,但是对于再大点的方阵,比如4×4的矩阵就需要将第二列和第三列互换。依此类推,要将矩阵顺时针旋转90度,首先转置,再将矩阵关于中间列对称的列互换下。
SeeBro 2011-08-13
  • 打赏
  • 举报
回复
改变读入原数组的方向,这个方法比较简单,矩阵可稍微修改下 简单写了个
#include <stdio.h>
#define max 10

char buf[max][max];
char tmp[max][max];

int main(void)
{
int n, i, j, k;
scanf("%d", &n);
k = n - 1;
scanf("%c", &buf[max][max]);

for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%c", &buf[i][j]);
}
}

/*****************/

for (i = 0; i < n; i++)
{
int t = 0;
for (j = 0; j < n; j++)
{
tmp[i][j] = buf[t++][k];

}
k--;
}

/*****************/

for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%c", tmp[i][j]);
}
}
printf("\n%d", buf[0][0]);
return 0;
}
xiayang05 2011-01-21
  • 打赏
  • 举报
回复
都不错 没想到方法这么多
kevin891227 2010-02-21
  • 打赏
  • 举报
回复
我只想看看得分的答案。。。
is_leon 2009-09-27
  • 打赏
  • 举报
回复
ayalicer
(小刀剜心)说出了解法,只是没有说清,小时侯站在岸上看河流看久了好像是人在动而不是水在流,对于矩阵旋转其实也可以这么看。我们对于一个矩阵总是从左往右从上往下看的,顺时针旋转90度的话,其实你可以把自己的脑袋逆时针旋转90,然后在以这个视角从左往右从上往下看。再回过来其实就变成了从下往上从左往右,其他的旋转类似。
0 1 2 6 3 0
3 4 5 -> 7 4 1
6 7 8 8 5 2
ProjectDD 2008-09-15
  • 打赏
  • 举报
回复
矩阵转置有专门的函数吗?
xibeitianlang 2008-09-14
  • 打赏
  • 举报
回复
方阵的8种同构状态一般以90°旋转Φ和转置Τ为基础变换,镜面反射可作为ΦΤ的复合变换。
当然,转置和镜面反射的复合也可以实现90°旋转,见13楼。
3×3方阵的研究,至少在宋朝以前就开始了,这就是九宫八卦,河图洛书的传说还要早很多。
戴九履一,左三右七,二四为肩,六八为足。五为中央,代表三阳两阴的太极图。各数乘3模10会顺时针旋转90°。
古代取模算法为过模数减去法,现代取模算法为满模数减去法。比如古代16 mod 8=8 数字从1开始。
对于矩阵的乘法取模算法古代和现代相同,因为n和n^2+1互质,n乘以小于n^2+1的自然数不会出现n^2+1的倍数。
引入互补的概念:如果a+b=n^2+1,则称a、b互补,记为a=-b mod n^2+1。
旋转90°的算法为:Bij=Aij×n mod n^2+1
反向旋转90°为:Bij=Aij×(-n) mod n^2+1=Aij×(n^2+1-n) mod n^2+1=n^2+1-Aij×n mod n^2+1。
youxia000 2008-09-12
  • 打赏
  • 举报
回复
乘以旋转矩阵

0 1
1 0

二维的旋转矩阵可以求出旋转后的坐标

图像处理中的旋转是这么做的

很多人都给出了挺好的方法,改变读取顺序, 用两次对称

高手啊
tailzhou 2008-09-10
  • 打赏
  • 举报
回复
sefule的解法强;
简单明了.
sefule 2008-09-10
  • 打赏
  • 举报
回复
这题比较熟,03年遇到过.

当年俺的解法:

先将矩阵转置,再将依次将各列首尾换.
123 147 741
456 258 852
789 369 963

到目前还没见到别人这么作过.呵呵
  • 打赏
  • 举报
回复
根本不用去旋转 加个读取优先度和方向就可以了
tailzhou 2008-09-05
  • 打赏
  • 举报
回复
输出:
D:\projects\cl>test
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15,
16, 17, 18, 19, 20,
21, 22, 23, 24, 25,
...................
21, 16, 11, 6, 1,
22, 17, 12, 7, 2,
23, 18, 13, 8, 3,
24, 19, 14, 9, 4,
25, 20, 15, 10, 5,
tailzhou 2008-09-05
  • 打赏
  • 举报
回复
测试代码:
#include <math.h>
#define n 5

int main(int argc, char* argv[])
{

int a[n][n]={0};
int i,j;

for (i=0;i<n ; i++)
{
for (j=0; j<n;j++ )
{
a[i][j]=i*n+j+1;
}
}

for (i=0;i<n ; i++)
{
for (j=0; j<n;j++ )
{
printf("%3d,",a[i][j]);
}
printf("\n");
}

for (i=0;i<n/2;i++)
{
int m=n-i*2;
if (m==1) break;

for (j=i;j<m+i-1;j++)
{
int tmp=a[i][j];
a[i][j]=a[n-j-1][i];
a[n-j-1][i]=a[n-i-1][n-j-1];
a[n-i-1][n-j-1]=a[j][n-i-1];
a[j][n-i-1]=tmp;
}
}
printf("...................\n");
for (i=0;i<n ; i++)
{
for (j=0; j<n;j++ )
{
printf("%3d,",a[i][j]);
}
printf("\n");
}
return 0;
}
tailzhou 2008-09-05
  • 打赏
  • 举报
回复
对方阵旋转90度;
相当于对n/2个正方形分别旋转90度
比如旋转方阵;
aaaaaaaaaaaaaa
abbbbbbbbbbbba
abccccccccccba
abcddddddddcba
abcdeeeeeedcba
abcdeffffedcba
abcdefggfedcba
abcdefggfedcba
abcdeffffedcba
abcdeeeeeedcba
abcddddddddcba
abccccccccccba
abbbbbbbbbbbba
aaaaaaaaaaaaaa
相当于分别旋转“由a组成的正方形”,“由b组成的正方形”...,“由g组成的正方形”

而对于旋转长度为m的正方形;
实际上是每四个点组成一个群:
a[i,j]-> a[j,n-i-1] ->a[n-i-1,n-j-1] -> a[n-j-1,i]-> a[i,j]
所以对正方形的上边的前m-1点依次执行替换就可以拉;
sssssjjjj 2008-09-05
  • 打赏
  • 举报
回复
Bij=Aij*(n^2-n+1) mod (n^2+1)
执假以为真 2008-09-05
  • 打赏
  • 举报
回复
木鱼儿说的也是对的,不过我忘了一个前提,就是这个矩阵自身进行变化,而不能用多余的内存空间,比如多余的变量或临时矩阵。
这样看来,大概就是考察3阶方阵这种特殊情况的了,天狼正解,木鱼儿也会给分。对于4阶方阵,还没想到好的公式。

大家再想想看吧,我这几天较忙,一周内结贴。谢谢了!
执假以为真 2008-09-05
  • 打赏
  • 举报
回复
天狼所说非常有道理,不知道你是在哪里看到这个算法的?
还有,若是m阶方阵,此方法应该可以扩展吧?扩展公式是什么呢?
执假以为真 2008-09-05
  • 打赏
  • 举报
回复
小火柴,不对,旋转以后当然就是n*m了,干嘛还要m*n呢?
先考虑方阵的情况吧。

我看看大家的发言先。
Woodman007 2008-09-05
  • 打赏
  • 举报
回复
LZ 想问的是不是这个:

1 个 m×n矩阵,用一个一维数组a[m*n] 表示,求一个算法,求出这个矩阵旋转90度后的矩阵,要求旋转后的的矩阵也用a[m*n]存储,算法只能用O(1)空间 。
xibeitianlang 2008-09-04
  • 打赏
  • 举报
回复
如果是3x3,有一个简单算法Bij=Aij*7 mod 10,即乘7取个位数。也可乘3取个位数,顺时针旋转90°
加载更多回复(2)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧