Przesuwanie elementów tablicy dwuwymiarowej

0

Cześć, mam pytanie dot. tego kodu. Mianowicie w funkcji main chcę, aby tablica, która powstałą po funkcji przesunięcie miała przesunięte elementy o 1 w prawo oraz ostatni element znalazł się na miejscu indeksu 0. Mam problem z tym, że po funkcji przesunięcie dostaje tablicę w postaci z którą mam problem w przekształceniu jej do funkcji dwuwymiarowej aby na końcu output tej tablicy był w postaci tablicy 4x4.
Z góry dziękuje za pomoc :)

#include <iostream>
using namespace std;

#define N 4 
#define M 4

void przesuniecie(int rows, int cols, int arr[N][M])  {
  

  int top = 0, bottom = rows - 1, left = 0, right = cols - 1;
  
 
  int dir = 1; //kierunek w ktorym tablica bedzie zmieniana
 
  while (top <= bottom && left <= right) {

    if (dir == 1) // z lewej do prawej
	{    
      for (int i = left; i <= right; ++i) 
	  {
        cout<<arr[top][i]  << " ";
      }
      
      ++top;
      dir = 2;
    } 
    else if (dir == 2)  // z gory do dolu
	{    
      for (int i = top; i <= bottom; ++i) 
	  {
          cout<<arr[i][right]  << " ";
      }
      
      --right;
      dir = 3;
    } 
    else if (dir == 3) // z prawej do lewej
	{    
      for (int i = right; i >= left; --i) 
	  {
          cout<<arr[bottom][i] << " ";
      }
      
      --bottom;
      dir = 4;
    } 
    else if (dir == 4) // z dolu do gory
	{    
      for (int i = bottom; i >= top; --i) 
	  {
          cout<< arr[i][left] << " ";
      }
      
      ++left;
      dir = 1;
    }
  }
}

int main() {
  
  int mat[N][M] = { { 1, 2, 3, 4 }, 
                  { 12, 13, 14, 5 }, 
                  { 11, 16, 15, 6 }, 
                  { 10, 9, 8, 7 } };
  
  przesuniecie(N, M, mat); 
  return 0; 
}
5

Funkcję którą podkradłeś w sieci wcale nie przesuwa zaś wypisuje elementy podanej tablicy spiralą.
Jak chcesz aby robiła coś innego to musisz albo podkraść inną funkcję albo zwyczajnie ją napisać.

0

Chcesz przesunąć elementy w każdym rzędzie tej tablicy? Czy źle rozumiem? W każdym razie, zainteresuj się std::rotate.

0

do sprawdzenia, bo nie wiem czy o to chodzi:

// (Debian 10.2.1-6) Code::Blocks 20.03 -std=c++14 or
// g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o

#include <iostream>
#include <iomanip>

using namespace std;

template<typename T, size_t N, size_t M>
auto show_me(const T (&arr)[N][M])
{
    for(const auto & row : arr)
    {
        for(const auto & col : row)
        {
            cout << right << setw(4) << col << " ";
        }
        cout << "\n";
    }
}
template<typename T>
auto exchange(T &x, T &y)
{
    T t;t=x;x=y;y=t;
}

template<typename T, size_t N, size_t M>
auto shift_right(T (&arr)[N][M])
{
    int new_size = N * M, counter{0};
    int * tab = new int[new_size]{0};
    for(unsigned int i = 0; i < N; ++i){
    for(unsigned int j = 0; j < M; ++j)
    {exchange(tab[counter],arr[i][j]);++counter;}
    }

    int tmp = tab[new_size-1];
    for(int i = new_size-1; i>=0; --i)
    {exchange(tab[i+1],tab[i]);}
    tab[0] = tmp;

    counter = 0; // reset counter
    for(unsigned int i = 0; i < N; ++i){
    for(unsigned int j = 0; j < M; ++j)
    {exchange(arr[i][j],tab[counter]);++counter;}
    }
    delete [] tab;  // memory free
    tab = NULL;
}

int main()
{

    int matrix[5][5] =
    {
        { 1, 2, 3, 4, 5 },
        { 6, 7, 8, 9, 10 },
        { 11, 12, 13, 14, 15 },
        { 16, 17, 18, 19, 20 },
        { 21, 22, 23, 24, 25 },
    };

    cout<<"Original :\n";
    show_me(matrix);
    cout<<"\n";
    cout<<"\nShift right :\n";
    shift_right(matrix);
    show_me(matrix);

    cout<<"\n\n";
    return 0;
}



1
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;

void show(const vector<vector<int>> &tb)
{
	for(size_t y=0;y<tb.size();++y,cout<<endl) for(size_t x=0;x<tb[y].size();++x) cout<<setw(4)<<tb[y][x]<<' ';
}

void rotate(vector<vector<int>> &tb)
{
	int Lf=-1,Rt=tb.size()?tb[0].size()-1:0,Tp=0,Bt=tb.size()-1,prev=-666;
	while((Lf<=Rt)&&(Tp<=Bt))
	{
		if(Tp<=Bt) for(int x=++Lf;x<=Rt;++x) swap(prev,tb[Tp][x]);
		if(Rt>=Lf) for(int y=++Tp;y<=Bt;++y) swap(prev,tb[y][Rt]);
		if(Bt>=Tp) for(int x=--Rt;x>=Lf;--x) swap(prev,tb[Bt][x]);
		if(Lf<=Rt) for(int y=--Bt;y>=Tp;--y) swap(prev,tb[y][Lf]);
	}
	swap(prev,tb[0][0]);
}

int main()
{
	vector<vector<int>> tb
	{
		{  1,  2,  3,  4,  5},
		{ 16, 17, 18, 19,  6},
		{ 15, 24, 25, 20,  7},
		{ 14, 23, 22, 21,  8},
		{ 13, 12, 11, 10,  9},
	};
	while(true)
	{
		show(tb);
		rotate(tb);
		while(cin.get()!='\n') {}
	}
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1