AP1994 Temat założony przez niniejszego użytkownika |
Jak obrócić zawartość wektora lub tablicy o 90°. » 2022-10-15 20:14:03 Przykładowy kod: #include <iostream> #include <vector> using namespace std;
int main() { vector < vector < int >> mapa = { { 1, 0, 0 }, { 1, 0, 0 }, { 1, 0, 0 } }; for( int i = 0; i <( int ) mapa.size(); i++ ) { for( int j = 0; j <( int ) mapa[ i ].size(); j++ ) { cout << mapa[ i ][ j ]; } if( i <( int ) mapa.size() ) { cout << endl; } } return 0; }
jak sprawić aby vector mapa obrócił się w taki sposób aby przyjął wartości: mapa = { { 0, 0, 0 }, { 0, 0, 0 }, { 1, 1, 1 } };
|
|
pekfos |
» 2022-10-15 22:44:12 Skopiuj dane do drugiego wektora we właściwe miejsca. Obrócone pozycje można łatwo obliczyć. Pierwszą kolumnę kopiujesz do ostatniego wiersza, drugą kolumnę do przedostatniego wiersza itd. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-16 10:54:22 Kod przykładowy miał tylko pokazać, co chcę uzyskać. Skopiuj dane do drugiego wektora we właściwe miejsca. Dla dużych wektorów modyfikowanych w trakcie działania programu mija się to z celem. |
|
pekfos |
» 2022-10-16 14:17:38 Możesz nadpisywać wektor źródłowy, ale będziesz musiał przenosić do 4 elementów naraz żeby nie stracić żadnych wartości. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-16 23:39:04 udało mi się napisać 2 wersje funkcji vector<vector<int>> vector_rotate(vector<vector<int>> v) vector < vector < int >> vector_rotate( vector < vector < int >> v ) { vector < int > tmp; vector < vector < int >> m; for( int i = 0; i <( int ) v.size(); i++ ) { for( int j = 0; j <( int ) v[ i ].size(); j++ ) { tmp.push_back( v[ i ][ j ] ); } m.push_back( tmp ); tmp.clear(); } return m; } vector < vector < int >> vector_rotate( vector < vector < int >> v ) { vector < int > tmp; vector < vector < int >> m; for( int j = 0; j <( int ) v[ 0 ].size(); j++ ) { for( int i = 0; i <( int ) v.size(); i++ ) { tmp.push_back( v[ i ][ j ] ); } m.push_back( tmp ); tmp.clear(); } return m; }
Niestety i tak nie osiągnąłem zamierzonego efektu, czyli z wektora o zawartości: 10000 10000 10000 10000 10000 zrobić wektor: 00000 00000 00000 00000 11111 |
|
nanoant20 |
» 2022-10-17 14:31:18 #include <iostream> #include <algorithm> #include <vector> #include <algorithm> using namespace std;
template < typename T > void print( T & v ) { for( const auto & row: v ) { for( const auto & col: row ) { cout << col << " "; } cout << "\n"; } cout << "\n"; }
template < typename T > T vector_rotate( T & v ) { if( v.size() == 0 ) return v; vector < vector < int >> tmp( v[ 0 ].size(), vector < int >() ); for( size_t i = 0; i < v.size(); ++i ) for( size_t j = 0; j < v[ i ].size(); ++j ) tmp[ j ].push_back( v[ i ][ j ] ); for( size_t i = 0; i < tmp.size() - 1; ++i ) std::rotate( tmp.rbegin(), tmp.rbegin() + 1, tmp.rend() ); v = tmp; return v; }
auto main()->int { vector < vector < int >> mapa = { { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 } }; print( mapa ); vector_rotate( mapa ); cout << "\n"; print( mapa ); return 0; }
|
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-18 17:46:59 Dziękuję, funkcja napisana przez nanoant20 działa świetnie. template < typename T > T vector_rotate( T & v ) { if( v.size() == 0 ) return v; vector < vector < int >> tmp( v[ 0 ].size(), vector < int >() ); for( size_t i = 0; i < v.size(); ++i ) for( size_t j = 0; j < v[ i ].size(); ++j ) tmp[ j ].push_back( v[ i ][ j ] ); for( size_t i = 0; i < tmp.size() - 1; ++i ) std::rotate( tmp.rbegin(), tmp.rbegin() + 1, tmp.rend() ); v = tmp; return v; }
|
|
« 1 » |