#33121: 給個小小的建議 (C++)


alex950301 (alex0301)

學校 : 新北市立新莊高級中學
編號 : 141423
來源 : [49.159.246.211]
最後登入時間 :
2024-10-19 20:13:44
b266. 矩陣翻轉 -- 2016 APCS 實作題第二題 | From: [61.64.1.159] | 發表日期 : 2022-12-03 01:24

這題我解了3個小時...

我的方法雖然不是最佳解,希望可以給個參考~

 

我第一個想法是用容器vector解 , 因為容器可以任意變換大小

簡單講解一下 二維vector的用法:

vector<vector<int>> vec ;
    int num ;
    for( int i = 0 ; i < n ; i++ ) {   // n , m 為陣列大小
        vector<int> temp ;
        for( int j = 0 ; j < m ; j++ ) {
            cin >> num ;
            temp.push_back( num ) ;
        }
        vec.push_back( temp ) ;
    }

//輸出只需要

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

}

這題的重點是旋轉和翻轉,翻轉相較簡單

for( int i = n - 1 ; i >= 0 ; i-- ) {    //翻轉  
        vector<int> temp ;
        for( int j = 0 ; j < m ; j++ ) {
            temp.push_back( x[i][j] ) ;
        }
        ans.push_back( temp ) ;

}

------------------------------------------------------------

for( int j = m - 1 ; j >= 0 ; j-- ) {   // 旋轉 
        vector<int> temp ;
        for( int i = 0 ; i < n ; i++ ) {
            temp.push_back( x[i][j] ) ;
        }
        ans.push_back( temp ) ;

}
swap( n , m ) ;   // 這裡需要想一下,因為旋轉會改變大小

------------------------------------------------------------

最後附上參考(在測試資料時會記憶體區段錯誤,但送出後AC,不知道是為什麼)

#include <iostream>
#include <vector>
using namespace std ;
int main() {
    int n , m , v , num , p ;
    cin >> n >> m >> v ;
    vector<vector<int>> ans , x ;
    for( int i = 0 ; i < n; i++ ) {
        vector<int> temp ;
        for( int j = 0 ; j < m ; j++ ) {
            cin >> num ;
            temp.push_back( num ) ;
        }
        x.push_back( temp ) ;
    }
    int order[v] ;
    for( int i = v - 1 ; i >= 0 ; i-- ) cin >> order[i] ;
    for( int k = 0 ; k < v ; k++ ) {
        if( order[k] == 1 ) {
            for( int i = n - 1 ; i >= 0 ; i-- ) {  //翻轉
                vector<int> temp ;
                for( int j = 0 ; j < m ; j++ ) {
                    temp.push_back( x[i][j] ) ;
                }
                ans.push_back( temp ) ;
            }
            
        } else {
            for( int j = m - 1 ; j >= 0 ; j-- ) {  // 旋轉
                vector<int> temp ;
                for( int i = 0 ; i < n ; i++ ) {
                    temp.push_back( x[i][j] ) ;
                }
                ans.push_back( temp ) ;
            }
            swap( n , m ) ;
        }
        x.clear() ;
        
        for( int i = 0 ; i < n ; i++ ) {
            vector<int> temp ;
            for( int j = 0 ; j < m ; j++ ) {
                temp.push_back( ans[i][j] ) ;
            }
            x.push_back( temp ) ;
        }
        ans.clear() ;
    }
    cout << n << " " << m << endl ;
    for( int i = 0 ; i < n ; i++ ) {
        for( int j = 0 ; j < m ; j++ ) {
            cout << x[i][j] << " " ;
        }
        cout << endl ;
    }
    return 0 ;
}

 

 

 
ZeroJudge Forum