【九度OJ】1200:最大的兩個數

地址:
http://ac.jobdu.com/problem.php?pid=1200
題目描述:
輸入一個四行五列的矩陣,找出每列最大的兩個數。
輸入:
輸入第一行包括一個整數n(1<=n<=1000),接下來的四行每行包括五個整數。代表一個四行五列的矩陣,矩陣元素全部是整數。
輸出:
可能有多組測試數據,對於每組數據,按照樣例輸出的格式將每列最大的兩個數輸出,如果最大的兩個數中的一個數在這一列中有多個相同的值,則行值取行值小的那一個。
輸出時要保留原矩陣的行列順序,即在原矩陣中行值小的,在輸出矩陣中的行值依然小。
樣例輸入:
1
1 2 4 9 8
-1 4 9 8 8
12 9 8 7 0
7 8 9 7 0
樣例輸出:
12 9 9 9 8
7 8 9 8 8
提示:
每個數字後面都要輸出一個空格
來源:
2005年華中科技大學計算機保研機試真題

解題思路:
我使用mark[4][5]來標記矩陣中每列最大的兩個數。
程序分三部分,一是輸入,二是找到最大的兩個數,三是輸出。
第二部分,循環兩遍,按列開始,第一遍循環找出最大的數,並標記mark爲1,第二遍找mark爲0的最大的數。
第三部分,循環兩遍,從列開始尋找mark爲1的數,第一遍循環中,當找到mark爲1的數,輸出該數,將mark變爲1,並跳出該列,第二遍循環中,直接輸出mark爲1的數。

源碼:

#include<stdio.h>
 
int n;
int data[ 4 ][ 5 ];
int mark[ 4 ][ 5 ];
 
int main(){
    while( scanf( "%d", &n ) != EOF ){
        while( n-- ){
            for( int i = 0; i < 4; i ++ ){
                for( int j = 0; j < 5; j ++ ){
                    scanf( "%d", &data[ i ][ j ] );
                    mark[ i ][ j ] = 0;
                }
            }
 
            //找到最大的兩個數
            //循環兩遍,按列開始,第一遍循環找出最大的數,並標記mark1,第二遍找mark0的最大的數
            int k = 2;
            while( k-- ){
                for( int j = 0; j < 5; j ++ ){
                    int biggerI;
                    if( mark[ 0 ][ j ] == 0 ){    
                        biggerI = 0;    //如果第一列的第一個數不是最大數,則以(0,j)開始
                    }
                    else{
                        biggerI = 1;    //如果第一列的第一個數是最大數,則以(1,j)開始
                    }
                    for( int i = 0; i < 4; i ++ ){
                        if( data[ i ][ j ] > data[ biggerI ][ j ] && mark[ i ][ j ] == 0 ){
                            biggerI = i;
                        }
                    }
 
                    mark[ biggerI ][ j ] = 1;
                }
            }
 
            //輸出,
            //循環兩遍,從列開始尋找mark爲1的數,第一遍循環中,當找到mark爲1的數,
            //輸出該數,將mark變爲1,並跳出該列,第二遍循環中,直接輸出mark爲1的數
            k = 2;
            while( k-- ){
                for( int j = 0; j < 5; j ++ ){
                    for( int i = 0; i < 4; i ++ ){
                        if( mark[ i ][ j ] == 1 ){
                            printf("%d ", data[ i ][ j ] );
                            mark[ i ][ j ] = 0;
                            break;
                        }
                    }
                }
 
                printf("\n");
            }
        }
    }
}
/**************************************************************
    Problem: 1200
    User: 螺小旋
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1020 kb
****************************************************************/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章