转置:
转置很简单的,就是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; }
以上就是这篇的所有内容。欢饮您找出错误或者提出改进意见,谢谢!