python旋转矩阵90°_C++之旋转矩阵和打印一个有规律的矩阵

旋转数组

描述:

某个图像通过一个整数组成的m*n矩阵表示,其中每个整数表示一个像素值。写出一种方法,根据flag变量的值将图像向右或者向左旋转90°。如果flag值为0,则向左旋转,如果flag为1,则向右旋转。

函数rotatePictureMethod的输入分别由矩阵matrix、矩阵的维度m和n以及flag的值组成。

函数应返回一个指向二维矩阵指针,该矩阵是按照flag值旋转后的结果矩阵而动态分配的。

示例:

如果标志flag=1且m=3,n=3,

输入矩阵

1   2   3

4   5   6

7   8   9

输出矩阵

7   4   1

8   5   2

9   6   3

思路:

逆时针旋转:

1 交换主对角线对称的元素;

2 交换第i行和第n-1-i行;

顺时针旋转:

1 交换副对角线对称的元素;

2 交换第i行和第n-1-i行;

原图: 第一步操作后: 第二步操作后:1 2 3 4 1 5 9 13 4 8 12 16

5 6 7 8 2 6 10 14 3 7 11 15

9 10 11 12 3 7 11 15 2 6 10 14

13 14 15 16 4 8 12 16 1 5 9 13

C++代码:

#include

using namespacestd;void swap(int* a, int*b)

{int t = *a;*a = *b;*b =t;

}//逆时针旋转

void transpose(int a[][4], intn)

{for (int i = 0; i < n; i++)for (int j = i+1; j < n; j++)

swap(a[i][j], a[j][i]);for (int i = 0; i < n / 2; i++)for (int j = 0; j < n; j++)

swap(a[i][j], a[n- 1 -i][j]);

}//顺时针旋转

void clockwise(int a[][4], intn)

{for (int i = 0; i < n; i++)for (int j = 0; j < n - i; j++)

swap(a[i][j], a[n- 1 - j][n - 1 -i]);for (int i = 0; i < n / 2; i++)for (int j = 0; j < n; j++)

swap(a[i][j], a[n- 1 -i][j]);

}int main(int argc, char**argv)

{int a[4][4] ={

{1, 2, 3, 4},

{5, 6, 7, 8},

{9, 10, 11, 12},

{13, 14, 15, 16}

};

cout<< "原矩阵" <

cout<< a[i][j] << " ";

cout<

}

cout<

transpose(a,4);

cout<< "逆时针转90度" <

cout<< a[i][j] << " ";

cout<

}

cout<

{1, 2, 3, 4},

{5, 6, 7, 8},

{9, 10, 11, 12},

{13, 14, 15, 16}

};

cout<< "原矩阵" <

cout<< a2[i][j] << " ";

cout<

}

clockwise(a2,4);

cout<

cout<< "顺时针转90度" <

cout<< a2[i][j] << " ";

cout<

}return 0;

}

打印一个有规律的矩阵

描述:

给定一个整数n,以下列方式打印n行。

如果n=4,生成的排列将为:

1*2*3*4

9*10*11*12

13*14*15*16

5*6*7*8

函数squarePatternPrint的输入应包括一个整数n(假设0<=n<=100)。不要从函数返回任何内容。使用cout打印所需的阵列。

各输出行只能由“数字”和“*”组成,不应有空格。

有用的命令:cout可将内容打印到屏幕上。

思路:

如果n为偶数,就打印n/2行,如果n为奇数,就打印n/2+1行;

以n=4举例,先打印1*2*3*4,把5压进栈,5+n = 9,打印9*10*11*12,把13压进栈,此时从栈顶读取13,打印13*14*15*16,弹出栈顶元素13,继续从栈顶读取5,打印5*6*7*8,判断此时栈内为空,end.

这种思路有些繁琐,我觉得肯定有更好的思路,只是我没想起来,如果你有更好的思路,欢迎评论!

C++代码:

#include #include

using namespacestd;void sprint(intn)

{

stacknums;int i = 1, j = 1, flag = 0;if (n % 2 == 0)

flag= n / 2;elseflag= n / 2 + 1;for (; i <= flag; i++)

{for (int k = 0; k < n; k++)

{if (j % n == 0) cout <

j++;

}

nums.push(j);

j= j +n;

cout<

}if (n % 2 != 0)

nums.pop();while (!nums.empty())

{int top =nums.top();

nums.pop();for (int k = 0; k < n; k++)

{if (top % n == 0) cout <

top++;

}

cout<

}

}intmain()

{

sprint(3);

}

参考:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值