首页 > 试题广场 >

矩阵最大值

[编程题]矩阵最大值
  • 热度指数:9378 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
编写一个程序输入一个mXn的矩阵存储并输出,并且求出每行的最大值和每行的总和。 要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值。 最后将结果矩阵输出。

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


输出描述:
可能有多组测试数据,对于每组数据,输出按题目要求执行后的矩阵。
示例1

输入

3 3
1 1 1
1 1 1
1 1 1
3 3
3 2 3
2 3 2
3 2 3

输出

3 1 1
3 1 1
3 1 1
8 2 3
2 7 2
8 2 3

python solution:

while True:
    try:
        row,col=map(int,input().split())
        for i in range(row):
            a=list(map(int,input().split()))
            a[a.index(max(a))]=sum(a)
            print(" ".join(map(str,a)))



    except:
        break
发表于 2017-10-04 11:10:52 回复(1)
#include<iostream>
#include<limits>
using namespace std;
//一次搞定,思路清晰
typedef struct Matrix
{
    int line;//行
    int row;//列
    int value;//值
};

int main(void)
{
    int m,n;
    
    while(cin >> m >> n)
    {
        Matrix matrix[m][n];
        Matrix matrix_temp[m];//存储每行之和以及每行第一个最大数的位置
        
        for(int i = 0;i < m;i++)
             matrix_temp[i].value = INT32_MIN;
                
        int sum;//计算每行之和
        
        for(int i = 0;i < m;i++)
        {
            sum = 0;
            for(int j = 0;j < n;j++)
            {
                cin >> matrix[i][j].value;
                matrix[i][j].line = i;
                matrix[i][j].row = j;
                sum += matrix[i][j].value;
                if(matrix[i][j].value > matrix_temp[i].value)//找到每行第一个最大数
                    matrix_temp[i] = matrix[i][j];
            }
            matrix_temp[i].value = sum;
        }
        
        for(int i = 0;i < m;i++)//对原矩阵重新赋值
        {
            int line = matrix_temp[i].line;
            int row = matrix_temp[i].row;
            matrix[line][row].value = matrix_temp[i].value;
        }
        
        for(int i = 0;i < m;i++)//输出
        {
            for(int j = 0;j < n;j++)
                cout << matrix[i][j].value << ' ';
            cout << endl;
        }
    }
    
    return 0;
}

发表于 2021-03-21 17:14:24 回复(0)
#include<stdio.h>//1.找到每行最大值的下标2.用整行和替换
int main()
{
    int m,n,i,j,sum,max,index,a[100][1000];
    scanf("%d%d",&m,&n);//输入
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<m;i++)//找到每行的和
    {
        sum=0;max=a[i][0];index=0;
        for(j=0;j<n;j++)
        {
            sum+=a[i][j];
            if(a[i][j]>max)//此时得到相同最大值的下标也是前面的符合规定
            {
                max=a[i][j];index=j;//最大值的下标
            }
        }
        a[i][index]=sum;
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
}

发表于 2020-03-30 15:01:48 回复(0)
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            int[][] matrix = new int[n][m];
            for (int i = 0; i < n; i++) {
                int max=Integer.MIN_VALUE;
                int index=0;
                int sum=0;
                for (int j = 0; j < m; j++) {
                    int val = scanner.nextInt();
                    if (val>max){
                        max= val;
                        index = j;
                    }
                    sum+= val;
                    matrix[i][j]=val;
                }
                matrix[i][index]=sum;
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) System.out.print(matrix[i][j]+" ");
                System.out.println();
            }
        }
    }
}


发表于 2020-03-19 10:11:35 回复(0)
#include <stdio.h>
#include <stdlib.h>
int main() {
    int m, n;
    while(scanf("%d%d", &m, &n) != EOF) {
        int a[m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++)
                scanf("%d", &a[i][j]);
        }
        int b[100] = {0};
        for(int i = 0; i < m; i++) {
            int sum = 0;
            sum += a[i][0];
            for(int j = 1; j < n; j++) {
                if(a[i][b[i]] < a[i][j]) 
                    b[i] = j;
                sum += a[i][j];
            }
            a[i][b[i]] = sum;      
        }
       for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++)
                printf("%d ", a[i][j]);
            printf("\n"); 
       } 
    }
    return 0;
}
编辑于 2020-03-15 15:55:28 回复(0)
/**
*C++的多维数组,实际是数组的数组
*
**/
#include <iostream>

using namespace std;

int main(){
    int m,n,max,maxIndex,sum;
    cin>>m>>n;
    int **arr=new int*[m];
    for(int i=0;i<m;++i){
        arr[i]=new int[n];
        for(int j=0;j<n;++j){
            cin>>(arr[i])[j];
        }
        max=(arr[i])[0];
        sum=0;
        maxIndex=0;
        for(int k=0;k<n;++k){
            if((arr[i])[k]>max){
                maxIndex=k;
                max=(arr[i])[k];
            }
            sum+=(arr[i])[k];
        }
        (arr[i])[maxIndex]=sum;
    }
    for(int i=0;i<m;++i){
        for(int j=0;j<n;++j)
            cout<<(arr[i])[j]<<' ';
        cout<<endl;
        delete [] arr[i];
    }
    delete [] arr;
    return 0;
}

编辑于 2020-03-11 15:06:09 回复(0)
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int findTheMax(int row,int col,int a[][100]);
int sum(int row,int col,int a[][100]);
int main(){
    int row,col;
    while(cin>>row>>col){
        int a[100][100];
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
                cin>>a[i][j];
        for(int i=0;i<row;i++){
            int index=findTheMax(i,col,a);
            a[i][index]=sum(i,col,a);
        }
        int flag=0;
         for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
            {
                flag++;
                if(flag%col==0){
                    cout<<a[i][j]<<endl;
                    flag=0;
                }
                else
                    cout<<a[i][j]<<" ";
            }
    }
    return 0;
}
int sum(int row,int col,int a[][100]){
    int sum=0;
    for(int i=0;i<col;i++){
        sum+=a[row][i];
    }
    return sum;
}
int findTheMax(int row,int col,int a[][100]){
    int max=a[row][0];
    int index=0;
    for(int i=1;i<col;i++){
        if(a[row][i]>max)
        {
            max=a[row][i];
            index=i;
        }
    }
    return index;
}
发表于 2020-01-20 16:08:34 回复(0)
//机试难度也不奢望这么简单了。。。边输入边遍历可以减少循环
#include<iostream>
using namespace std;
int main(){
    int m,n;
    while(cin>>m>>n){
        int **a=new int*[m];
        for(int i=0;i<m;i++)
            a[i]=new int[n];
        for(int i=0;i<m;i++){
            int max=-999999,total=0,pos=0;
            for(int j=0;j<n;j++){
                cin>>a[i][j];
                if(a[i][j]>max){
                    max=a[i][j];
                    pos=j;
                }
                total+=a[i][j];
            }
            a[i][pos]=total;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n-1;j++)
                cout<<a[i][j]<<" ";
            cout<<a[i][n-1]<<endl;
        }
    }
}

发表于 2020-01-15 22:43:33 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int bit(int);
int main(){
    int num,square;
    int n;
    int low;
    scanf("%d",&num);
    square=pow(num,2);
    n=bit(square);
    low=square%(int)(pow(10,n-1));
    if(low==num){
        printf("Yes!");
    }
    else{
        printf("No!");
    }
    return 0;
}
int bit(int n){
    int i=0;
    while(n!=0){
        n=n/10;
        i++;
    }
    return i;
}

发表于 2020-01-05 18:22:24 回复(0)
#include<bits/stdc++.h>
int main(){
    int m,n,a[100][100];
    while(scanf("%d %d",&m,&n)!=EOF){
        for(int i=0;i<m;i++){
            int sum=0,mark=0,max=0;
            for(int j=0;j<n;j++){
                scanf("%d",&a[i][j]);
                sum+=a[i][j];
                if(a[i][j]>max){
                    max=a[i][j];
                    mark=j;
                }
            }
            a[i][mark]=sum;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++)
                printf("%d ",a[i][j]);
            printf("\n");
        }
    }
}
发表于 2019-03-28 21:20:04 回复(0)

正常思路,一步一步来就行

#include<iostream>
using namespace std;

int main(){
    int matrix[100][100];
    int m, n;

    while(cin >> m >> n){
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                cin >> matrix[i][j];
            }
        }

        for(int i = 0; i < m; i++){
            int max = matrix[i][0];
            int sum = 0;
            int max_index = 0;
            for(int j = 0; j < n; j++){
                if(max < matrix[i][j]){
                    max = matrix[i][j];
                    max_index = j;
                }
                sum += matrix[i][j];
            }

            matrix[i][max_index] = sum;
        }

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }

    }
    return 0;
}
编辑于 2019-02-12 21:41:24 回复(0)
编辑于 2018-10-31 11:19:16 回复(0)
#include<stdio.h>

int main(){
    int m,n;
    int i,j;
    int a[101][101];
    int s;
    int b[101];
    int c[101];
    int M;
    scanf("%d",&m);
    scanf("%d",&n);
    for(i=0;i<m;i++){
        s=0;
        M=0;
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            M=a[i][j]>M?a[i][j]:M;
            s=s+a[i][j];
        }
        b[i]=s;
        c[i]=M;
    }

    for(i=0;i<m;i++){
        j=0;
        while(a[i][j]!=c[i])
            j++;
        a[i][j]=b[i];
    }

    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            if(j!=n-1)
                printf("%d ",a[i][j]);
            else
                printf("%d",a[i][j]);
        }
        if(i!=m-1)
            printf("\n");
    }
    return 0;
}
发表于 2018-06-02 23:35:39 回复(0)
package com.speical.first;

import java.util.Scanner;

/**
 * 矩阵的最大值
 * 
 * 正常思路就行
 * @author Special
 * @time 2018/02/10 16:28:30
 */
public class Pro215 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        while(input.hasNext()) {
            int m = input.nextInt();
            int n = input.nextInt();
            int[][] nums = new int[m][n];
            int index, sum, max, num;
            for(int i = 0; i < m; i++) {
                index = 0;
                sum = 0;
                max = Integer.MIN_VALUE;
                for(int j = 0; j < n; j++) {
                    num = input.nextInt();
                    if(num > max) {
                        index = j;
                        max = num;
                    }
                    sum += num;
                    nums[i][j] = num;
                }
                nums[i][index] = sum;
            }
            for(int i = 0; i < m; i++) {
                for(int j = 0; j < n; j++) {
                    System.out.print((j == 0 ? "" : " ") + nums[i][j]);
                }
                System.out.println();
            }
        }
    }

}
发表于 2018-02-10 16:39:52 回复(0)
//看代码吧~
#include <iostream>
#include <cstdio>
using namespace std;
long long nums[105];
int main(){
    int m,n;
    long long sum;
    while(scanf("%d%d",&m,&n)!=EOF){
        for(int i=0,max,point;i<m;++i){
            max=-10000000;point=1;sum=0;
            for(int j=0;j<n;++j){
                cin>>nums[j];
                if(max<nums[j]){
                       max=nums[j];
                    point=j;
                }
                sum+=nums[j];
            }
            nums[point]=sum;
            for(int j=0;j<n;++j)printf("%d%c",nums[j],j==n-1?'\n':' ');
        }
    }
    return 0;
}

发表于 2018-02-01 21:43:36 回复(0)
#include<stdio.h>
int main()
{
    int a[100][100],m,n,i,j,sum,max,k;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
        for(i=0;i<m;i++)
        {
            sum=0;
            max=a[i][0];
            k=0;
            for(j=0;j<n;j++)
            {
                if(a[i][j]>max)
                {
                    k=j;
                    max=a[i][j];
                }
                sum+=a[i][j];
            }
            a[i][k]=sum;
        }
        for(i=0;i<m;i++)
            {
                for(j=0;j<n-1;j++)
                printf("%d ",a[i][j]);
                printf("%d\n",a[i][j]);
            }
    }
    return 0;
}
发表于 2017-12-31 14:32:50 回复(0)
#include <iostream>
#include <string.h>
using namespace std;

int main(){
    int matrix[100][100],m,n;
    while(cin>>m>>n){
        int i,j;
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                cin>>matrix[i][j];
        for(i=0;i<m;i++){
            int max=0,sum=0;
            for(j=0;j<n;j++){
                if(matrix[i][max]<matrix[i][j])
                    max=j;
                sum+=matrix[i][j];
            }
            matrix[i][max]=sum;
        }
        for(i=0;i<m;i++){
            for(j=0;j<n-1;j++){
                cout<<matrix[i][j]<<" ";
            }
            cout<<matrix[i][n-1]<<endl;
        }
    }
    return 0;
}
发表于 2017-12-09 16:17:52 回复(0)

#include<stdio.h>

int main(void){
int m, n;
int arr[100][100];
while (scanf("%d%d", &m, &n) != EOF){
for (int i = 0; i < m; i++){
int max=0, sum = 0,index = 0;
for (int j = 0; j < n; j++){
scanf("%d", &arr[i][j]);
sum += arr[i][j];
if (max < arr[i][j]){
max = arr[i][j];
index = j;
}
}
arr[i][index] = sum;
}
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++)
   printf("%d%s",arr[i][j],j==n-1?"\n":" ");
}
}
return 0;
}
发表于 2017-10-23 10:31:14 回复(0)
//边输入边确定最大值可以不用多余的循环
#include <iostream>
#include <vector>
#include <algorithm>


using namespace std;

int main()
{
    int a, b;
    while (cin >> a >> b)
    {
        vector<vector<int>> array(a, vector<int>(b));
        for (int i = 0; i < a; i++)
        {
            int sum = 0, max = 0;
            for (int j = 0; j < b; j++)
            {
                cin >> array[i][j];
                sum += array[i][j];
                if(array[i][j] > array[i][max])
                    max = j;
            }
            array[i][max] = sum;
            for (int j = 0; j < b; j++)
            {
                cout << array[i][j] << " ";
            }
            cout << endl;
        }
    }

    
}


发表于 2020-02-07 14:48:30 回复(0)
#include<stdio.h>
int findmax(int a[],int n){
    int max=a[0];
    int index=0;
    for(int i=1;i<n;i++){
        if(a[i]>max){
            max=a[i];
            index=i;
        }
    }
    return index;
}
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        int arr[100][100];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&arr[i][j]);
            }
        }

        for(int i=0;i<m;i++){
            int sum=0;
            for(int j=0;j<n;j++){
                sum+=arr[i][j];
            }
            int index=findmax(arr[i],n);
            arr[i][index]=sum;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j!=n-1)printf("%d ",arr[i][j]);
                else printf("%d",arr[i][j]);
            }
            if(i!=m-1)printf("\n");
        }

    }
    return 0;
}

发表于 2018-02-23 20:42:38 回复(0)