首页 > 试题广场 >

矩阵转置

[编程题]矩阵转置
  • 热度指数:15136 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一个N*N的矩阵,将其转置后输出。要求:不得使用任何额外数组(就地逆置)。

输入描述:
输入的第一行包括一个整数N,(1<=N<=100),代表矩阵的维数。
接下来的N行每行有N个整数,分别代表矩阵的元素。


输出描述:
可能有多组测试数据,对于每组数据,将输入的矩阵转置后输出。
示例1

输入

3
1 2 3
4 5 6
7 8 9

输出

1 4 7
2 5 8
3 6 9
#include <cstdio>

const int N = 100;

void swap(int *a, int *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

int main()
{
	int matrix[N][N];
	int n;
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				scanf("%d", &matrix[i][j]);
			}
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < i; j++)
			{
				swap(&matrix[i][j], &matrix[j][i]);
			}
		}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n - 1; j++)
			{
				printf("%d ", matrix[i][j]);
			}
			printf("%d\n", matrix[i][n - 1]);
		}
	}
}
发表于 2017-06-05 08:48:28 回复(0)
#include <stdio.h>

int main()
{
    int n,i,j,t;
    while(scanf("%d",&n)!=EOF)
    {
        int a[n][n];
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                scanf("%d",&a[i][j]);
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                t=a[i][j];
                a[i][j]=a[j][i];
                a[j][i]=t;
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
    }
}

发表于 2021-02-16 21:20:17 回复(1)
#include<stdio.h>//直接看对称a[i][j]与a[j][i]直接交换
int main()
{
    int n,a[100][100],i,j,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)//输入
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<n;i++)//交换
        for(j=i+1;j<n;j++)//上三角
        {
            t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;
        }
    for(i=0;i<n;i++)//输出
    {
        for(j=0;j<n;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}

编辑于 2020-03-28 20:57:37 回复(0)
Java 
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] matrix = new int[n][n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) matrix[j][i] = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) System.out.print(matrix[i][j] + " ");
            System.out.println();
        }
    }
}


发表于 2020-03-18 15:38:59 回复(0)
n = int(input())
array = []
for i in range(n):
    array.append(map(int,input().split()))
array = list(map(list,zip(*array)))
for each in array:
    print(*each)
Python solution
发表于 2018-07-05 01:43:23 回复(0)

#include <iostream>

using namespace std ;

int main() {

    int N;

    int x,y;

    

    int i;

    int *p = NULL ;

    

    while ( scanf ( "%d" ,&N) == 1 ) {

        if (N > 100 || N < 1 ) {

            continue ;

        }

        p = ( int *) malloc ( sizeof ( int ) * N * N);

        

        // x 为余数, y 为商

        

        for (i = 0 ; i < N * N; i++) {

            cin >> *(p+i);

        }

        

        for (i = 0 ; i < N * N; i++) {

            x = i % N;

            y = i / N;

            cout << *(p+x*N+y);

            if (x == N- 1 ) {

                cout << '\n' ;

            }

            else {

                cout << ' ' ;

            }

            

        }

    }

    

    return 0 ;

}

发表于 2016-08-15 23:25:16 回复(0)
#include <stdio.h>
int main(){
    int N;
    while(~scanf("%d",&N)){
        int m[100][100];
        for(int i = 0; i < N; ++i)
            for(int j = 0; j < N; ++j)
            	scanf("%d",&m[i][j]);
        for(int i = 0; i < N; ++i){
            for(int j = 0; j < N; ++j){
            	printf("%d",m[j][i]);
                if(j==N-1)
                    printf("\n");
                else
                    printf(" ");
        	}
        }   
    }
    return 222;
}

编辑于 2016-09-11 19:40:46 回复(3)
在输入的时候就放在对应的位置上。我是不是偷懒了?
            int num = sin.nextInt();
            int[][] values = new int[num][num];
            for(int i=0;i<num;i++){
                for(int j=0;j<num;j++){
                    values[j][i] = sin.nextInt();
                }
            }

发表于 2017-05-03 21:38:08 回复(9)

python三行代码搞定。




while True:
    try:
        a,matrix=int(input()),[]
        for i in range(a):matrix.append(input().split())
        for i in zip(*matrix):print(" ".join(i))

    except:
        break
发表于 2017-10-06 22:26:18 回复(1)
//注意交换的时候只需要对上/下三角操作即可,否则交换两次回到原地,不过那个直接输出的也是很秀
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int **a=new int*[n];
        for(int i=0;i<n;i++)
            a[i]=new int[n];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cin>>a[i][j];
        for(int i=0;i<n;i++)
            for(int j=i;j<n;j++){
                int temp=a[i][j];
                a[i][j]=a[j][i];
                a[j][i]=temp;
            }
        for(int i=0;i<n;i++){
            for(int j=0;j<n-1;j++)
                cout<<a[i][j]<<" ";
            cout<<a[i][n-1]<<endl;
        }
    }
}

发表于 2020-01-14 16:37:46 回复(0)
//我一直以为不用数组就是没有数组出现,为什么别人的代码都有一个二维数组--> _ -->
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a;
    while(cin>>n)
    {
        string s;
        char c='a';
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                cin>>a;
                if(n==1)
                    break;
                string temp;
                while(a)
                {
                    temp+=a%10+'0';
                    a/=10;
                }
                reverse(temp.begin(),temp.end());
                s+=temp;
                s+=c;
            }
        }
        if(n==1)
        {
            cout<<a<<endl;
            continue;
        }
        int j=0;
        int k=1,num=0;
        int len=s.size();
        for(int i=0; i<len; i++)
        {
            string temp;
            while(i<len&&s[i]!='a')
                temp+=s[i],i++;
            if(s[i]=='a')
                j++;
            if(j%n==k)
            {
                cout<<temp<<" ";
                num++;
            }
            if(num==n)
            {
                num=0;
                j=0;
                cout<<endl;
                i=-1;
                if(k==0)
                    break;
                k=(k+1)%n;
            }
        }
    }
    return 0;
}




发表于 2018-10-08 09:24:02 回复(3)
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N,t,i,j,m;
    while(scanf("%d",&N)!=EOF)
    {
        int *a=(int*)malloc(sizeof(int)*N*N);
        for(i=0;i<N*N;i++)
         {
             scanf("%d",&a[i]);
         }
        for(i=0;i<N;i++)
            for(j=i*N+i+1,m=1;j<N*N&&m<N-i;j++,m++)
        {
            t=a[j];
            a[j]=a[j+m*(N-1)];
            a[j+m*(N-1)]=t;
        }
         for(i=0;i<N;i++)
         {
             for(j=0;j<N-1;j++)
             printf("%d ",a[i*N+j]);
             printf("%d\n",a[i*N+j]);
         }
         free(a);
    }
    return 0;
}
发表于 2017-12-30 21:21:27 回复(2)
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int buf[105][105];
int main()
{
    int N;
    while(scanf("%d",&N)!=EOF)
    {
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                cin>>buf[i][j];
            }
        }
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<i;j++)//注意只要遍历下或上三角即可
            {
                int t = buf[i][j];
                buf[i][j] = buf[j][i];
                buf[j][i] = t;//交换下标数据
            }
        }
        for(int i=0;i<N;i++)//输出要注意格式
        {
            for(int j=0;j<N;j++)
            {
                if(j==0) cout<<buf[i][j];
                else cout<<" "<<buf[i][j];
            }
            cout<<endl;
        }
    }
    return 0;
}


发表于 2019-03-15 09:29:30 回复(0)
偷懒做法
#include<iostream>
#include<cstdio>

using namespace std;

int main(){
    int n,a[100][100];
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<a[j][i]<<" ";
        }
        cout<<endl;
    }
}


发表于 2021-03-02 16:39:07 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int a[100][100], n;
    while (cin >> n)
    {
        for (int i = 0; i < n; i++)//输入矩阵
        {
            for (int j = 0; j < n; j++)
            {
                cin >> a[i][j];
            }
        }
        for (int i = 0; i < n; i++)//转置
        {
            for (int j = 0; j < i; j++)
            {
                int t = a[i][j];
                a[i][j] = a[j][i];
                a[j][i] = t;
            }
        }
        for (int i = 0; i < n; i++)//输出
        {
            for (int j = 0; j < n; j++)
            {
                if (j != n - 1)
                {
                    cout << a[i][j] << " ";
                }
                else
                    cout << a[i][j] << endl;
            }
        }
    }
    return 0;
}

发表于 2018-06-30 09:05:15 回复(0)
#include <iostream>
#include<cstdio>
using namespace std;
int arr[101][101];
int main() {
    int n;
    int temp=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&arr[i][j]);
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<i;j++){
            temp=arr[i][j];
            arr[i][j]=arr[j][i];
            arr[j][i]=temp;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d",arr[i][j]);
            if(j<n-1)
                printf(" ");
        }
        printf("\n");
    }
   

}
编辑于 2024-03-20 02:13:17 回复(0)
#include <array>
#include <iostream>
using namespace std;

const int MAXN = 101;

array<array<int, MAXN>, MAXN>matrix;

int main() {
    int n;
    while (cin >> n) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cin >> matrix[i][j];
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }
    }
    return 0;
}

编辑于 2024-03-10 22:37:16 回复(0)
#include <iostream>
using namespace std;


//交换
void swap(int *a,int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

int main() {
	int n = 0;
	cin >> n;
	int arr[100][100];
	// 输入:
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> arr[i][j];
		}
	}
	// 遍历矩阵的上三角
	for (int i = 0; i < n; i++) { //行
		for (int j = i; j < n; j++) {
			//交换arr[i][j]和arr[j][i];
			swap(&arr[i][j],&arr[j][i]);
		}
	}
	// 打印
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}

发表于 2024-01-15 13:21:24 回复(0)
#include <iostream>
using namespace std;
const int N=110;
int a[N][N],b[N][N];
int main()
{
    int n;
    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];
         }
    }
    for(int i=0;i<n;i++)
    {
         for(int j=0;j<n;j++)
         {
              b[i][j]=a[j][i];
         }
    }
    for(int i=0;i<n;i++)
    {
         for(int j=0;j<n;j++)
         {
              if(j==n-1) cout<<b[i][j]<<endl;
              else cout<<b[i][j]<<" ";
         }
    }

    }
   
     
}
编辑于 2024-01-06 09:20:40 回复(0)
在输入时就将转置后的数据填入数组;但据题意正确做法应该是源数据填入数组后将元素Aij与元素Aji交换位置(i≠j)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n=0;
    cin>>n;
    vector<vector<int>>matrix(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int num=0;
            cin>>num;
            matrix[j][i]=num;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<matrix[i][j]<<" ";
        }
        cout<<endl;
    }
}
// 64 位输出请用 printf("%lld")

发表于 2023-08-06 15:09:48 回复(0)