赞
踩
转置:
转置很简单的,就是a[i][j] -- > a[j][i]即可。可以开辟一个新的二维数组。b[i][j] = a[j][i]即可。
例题:输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何数组(就地逆置)。
此时应该怎么办呢?只要根据题目要求,直接输出就可以啦!(解释一下,为什么我的输出部分要写成下面这样,把最后一列单独输出出来, 那是因为在大多数的oj上,运行通过的要求是最后一列输出不准存在空格)。
- #include<iostream>
- using namespace std;
- int main(){
- int a[101][101];
- int n;
- while(cin >> n){
- int p, q, i, j;
- for(i = 0; i < n; i ++){
- for(j = 0; j < n; j ++){
- cin >> a[i][j];
- }
- }
- for(i = 0; i < n; i ++){
- for(j = 0; j < n - 1; j ++){
- cout << a[j][i] << " ";
- }
- cout << a[n - 1][i] << endl;
- }
- }
- return 0;
- }
旋转:
我们这里只分析旋转90度之后的矩阵和原矩阵的联系。旋转180, 270之类的可以理解将旋转后的矩阵再旋转n*90即可。
顺时针:
- void swap(long long &a, int &b){
- int temp = a;
- a = b;
- b = temp;
- }
- void rotate1(long long a[][20], int n){// 顺时针。
- for(int i = 0; i < n; i ++){// 先交换主对角线两端的数即可。
- for(int j = i; j < n; j ++){
- swap(a[i][j], a[j][i]);
- }
- }
- for(int i = 0; i < n ; i ++){
- for(int j = 0; j < n / 2; j ++){
- swap(a[i][j], a[i][n - 1 - j]);
- }
- }
- }
使用一个新开辟的数组:
- void rotate1(long long a[][20], int n){// 顺时针
- int y[20][20];
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- y[i][j] = a[n - 1 - j][i];
- }
- }
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- a[i][j] = y[i][j];
- }
- }
- }
逆时针:
- void swap(long long &a, int &b){
- int temp = a;
- a = b;
- b = temp;
- }
- void rotate1(long long a[][20], int n){// 逆时针。
- 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]);
- }
- }
- }
开辟新空间直接转换这里就不提供了。(以上使用long long 没有特别的意思, 只是我刚好做的一题中的要求。)
例题:
Give you a nn matrix, if you rotate it 90 degrees, we call it 1-Matrix, if you rotate it 180 degrees, we call it 2-Matrix, etc … This is said if you rotate the Matrix 90k degrees, then we call it k-Matrix. Now, your task is to calculate all the sum of i-Matrix (0<= i<= k).
它的意思是求旋转n次之后左右的矩阵的和,包括自己本身。
分析:1.旋转360度之后是不是又回到了原来的样子,那么我们可以以这4次旋转的和为一个基底,看看一共进行了多少个4,再把多余出来的加上去进行了吧。2.需要加上自己原来输入的这个矩阵,但是显然它在不停的旋转啊,所以就可以定义一个二维数组将它存起来,在开辟一个做存储和的二维数组即可。
参考代码:
- #include<iostream>
- using namespace std;
-
- void swap(long long &a, int &b){
- int temp = a;
- a = b;
- b = temp;
- }
- void rotate1(long long a[][20], int n){// 顺时针。
- for(int i = 0; i < n; i ++){// 先交换主对角线两端的数即可。
- for(int j = i; j < n; j ++){
- swap(a[i][j], a[j][i]);
- }
- }
- for(int i = 0; i < n ; i ++){
- for(int j = 0; j < n / 2; j ++){
- swap(a[i][j], a[i][n - 1 - j]);
- }
- }
- }
- int main(){
- int n, m , l, t;
- long long a[20][20], b[20][20], c[20][20];
- while(cin >> n){
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- cin >> a[i][j];
- b[i][j] = a[i][j];
- c[i][j] = 0;
- }
- }
-
- rotate1(a, n);
- cin >> m;
- l = m; m = m / 4;
- for(t = 1; t <= 4; t ++){
- rotate1(a, n);
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- c[i][j] += a[i][j];
- }
- }
- }
-
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- c[i][j] = m * c[i][j];
- }
- }
- for(t = 1; t <= l % 4; t ++){
- rotate1(a, n);
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n; j ++){
- c[i][j] += a[i][j];
- }
- }
- }
-
- for(int i = 0; i < n; i ++){
- for(int j = 0; j < n - 1; j ++){
- cout << c[i][j] + b[i][j]<< " ";
- }
- cout << c[i][n - 1] + b[i][n - 1]<< endl;
- }
- }
- return 0;
- }
以上就是这篇的所有内容。欢饮您找出错误或者提出改进意见,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。