這題我解了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 ;
}