Problem A: Matrix Problem : Array Practice
Time Limit: 1 Sec Memory Limit: 4 MB
Submit: 20828 Solved: 7609
[Submit][Status]
Description
求一个m×n阶矩阵A的转置矩阵AT。矩阵A的每个元素都在int类型的范围之内。
Input
输入的第一行为一个整数M(M>0),后面有M组输入数据。每组数据以两个正整数m和n开始,满足0<m,n<=100,接下来为一个m行n列的矩阵A。
Output
输出为多组,每组输出A的转置矩阵AT。矩阵的输出为:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。每两组输出之间用一个空行分隔开。
Sample Input
1
3 3
1 2 3
4 5 6
7 8 9
Sample Output
1 4 7
2 5 8
3 6 9
HINT
二维数组存储矩阵。
Append Code
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,n;
int m[102][102];
int i,o,j;
scanf("%d",&n);
for(j=1; j<=n;j++){
scanf("%d %d",&a,&b);
for(i=0; i<a;i++){
for(o=0;o<b; o++){
scanf("%d",&m[i][o]);
}
}
for(i=0; i<a;i++){
for(o=0; o<b;o++){
if(o==0)printf("%d",m[o][i]);
else printf(" %d",m[o][i]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define maxn 11
int mat[maxn][maxn];
void swap(int* a, int* b) { // (1)
int tmp = *a;
*a = *b;
*b = tmp;
}
void maxtrixT(int n, int mat[][maxn]) { // (2)
int i, j;
for(i = 0; i < n; ++i) {
for(j = i; j < n; ++j) { // (3)
swap( &mat[i][j], &mat[j][i] ); // (4)
}
}
}
int main() {
int n;
int i, j;
while(scanf("%d", &n) != EOF) {
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j) {
scanf("%d", &mat[i][j]);
}
}
maxtrixT(n, mat);
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j) {
if(j) printf(" "); // (5)
printf("%d", mat[i][j]);
}
puts("");
}
}
return 0;
}
( 1 ) 利用指针,实现了变量的交换。
( 2 ) 转置函数的定义,其中第二个参数是个矩阵,二维数组的高维(即第一维)可以不定义;
( 3 ) 注意,这里的 j必须从 i开始枚举,不能从 0 开始,如果不理解,可以试试改成 0 以后,程序的执行结果;
( 4 ) 利用 swap实现 mat[i][j] 和 mat[j][i] 的变量交换;
( 5 ) 空格作为矩阵输出时的分隔符,之所以这么些,是因为第一个数字之前不需要分隔符;