地址
http://ac.jobdu.com/problem.php?pid=1191
題目描述:
編寫一個程序輸入一個mXn的矩陣存儲並輸出,並且求出每行的最大值和每行的總和。
要求把每行總和放入每行最大值的位置,如果有多個最大值,取下標值最小的那一個作爲最大值。
最後將結果矩陣輸出。
輸入:
輸入的第一行包括兩個整數m和n(1<=m,n<=100),分別代表矩陣的行和列的維數。
接下來的m行每行有n個數,代表矩陣的元素。
輸出:
可能有多組測試數據,對於每組數據,輸出按題目要求執行後的矩陣。
樣例輸入:
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
來源:
2007年華中科技大學計算機研究生機試真題
編寫歷程
一開始提交的是錯誤的,不知道錯在了哪裏,就想去網上搜搜,看看其他人代碼裏面的思路,再找出自己沒有考慮到的地方一開始,我在輸入數據的時候是這麼寫的
for( int i = 0; i < m; i ++ ){
maxN = 0;
maxNum = 0;
sumLine = 0;
for( int j = 0; j < n; j ++ ){
scanf("%d", &a);
matrix[ i ][ j ] = a;
sumLine += a; //求這一行的和
if( a > maxNum ){
maxNum = a;
maxN = j;
}
matrix[ i ][ maxN ] = sumLine;
}
就是先初始這是了一個maxNum = 0,如果有遇到比這個數大的,那就替換掉,並記錄這個大的數的座標,因爲沒有考慮到輸入的數據可以是0,負數之類的,那樣的話,naxNum就持續爲0,也沒法記錄到大的數的座標。最後換成了這樣的
for( int i = 0; i < m; i ++ ){
maxN = 0;
sumLine = 0;
for( int j = 0; j < n; j ++ ){
scanf("%d", &a);
matrix[ i ][ j ] = a;
sumLine += a; //求這一行的和
if( a > matrix[ i ][ maxN ] ){
maxN = j;
}
}
matrix[ i ][ maxN ] = sumLine;
}
就是初始化一個縱座標maxN = 0, 這樣在輸入的時候,首先會和(i,0)這個數進行比較,如果有比(i,0)這個數大的,那麼這個數的縱座標就會賦值給maxN。
源碼
#include<stdio.h>
int main(){
int matrix[ 105 ][ 105 ];
int m,n;
int a;
int maxN, sumLine = 0;
while( scanf("%d %d", &m, &n) != EOF ){
for( int i = 0; i < m; i ++ ){
maxN = 0;
sumLine = 0;
for( int j = 0; j < n; j ++ ){
scanf("%d", &a);
matrix[ i ][ j ] = a;
sumLine += a; //求這一行的和
if( a > matrix[ i ][ maxN ] ){
maxN = j;
}
}
matrix[ i ][ maxN ] = sumLine;
}
for( int i = 0; i < m; i ++ ){
printf("%d", matrix[ i ][ 0 ] );
for( int j = 1; j < n; j ++ ){
printf(" %d", matrix[ i ][ j ] );
}
printf("\n");
}
}
}