Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

C++ перемещение значений двумерного массива

почему-то не перемещает влево, хотя вроде все правильно написано

const int r = 3;
const int t = 3;
int h[r][t];
int f;
int s;
srand(time(NULL));
for (int i = 0;i < r;i++)
{
for (int j = 0;j < t;j++)
{
h[i][j] = rand() % 100;
cout << h[i][j] << " ";
if (j == t - 1) { cout << endl; }
}
}
cout << "Выберите количество сдвигов: ";
cin >> f;
for (int i = 0; i < r; i++)
{
for (int x = 0; x < f; x++)
{
int s = h[i][0];
for (int j = 0;j < t - 1;j++)
{
h[i][j] = h[i][j + 1];
}
h[i][t - 1] = s;
}
}

По дате
По рейтингу
Аватар пользователя
Новичок
9мес

Если бы ты дал текст задания, которое пытаешься решить, было бы куда проще.
Судя по коду, ты делаешь циклический сдвиг элементов строк массива влево - отдельно каждую строку. Но циклический сдвиг - это просто перестановка двух частей массива местами.

123456789101112131415161718192021222324252627282930313233343536
 vector<vector<int>> h(r, vector<int>(t)); // Двумерный массив в C++

// Для последовательной обработки всех элементов массива
// такой цикл удобнее
for (auto &row : h) {
  for (auto &cell : row) {
    cell = rand() % 100;
    cout << cell << ' ';
  }
  cout << '\n';
}

// Поучение кол-ва сдвигов: > 0 - сдвиг влево, < 0 - сдвиг вправо
int f;
cin >> f;
f = (t + f % t) % t; // Минимально необходимое кол-во сдвигов влево
if (f == 0) {
  cout << "Массив не изменяется";
  return 0;
}

// Собственно сдвиг
vector<int> temp(f);
for (auto &row : h) {
  copy(row.begin(), row.begin() + f, temp.begin()); // Копия левой части
  copy(row.begin() + f, row.end(), row.begin()); // Перемещение правой части влево
  copy(temp.begin(), temp.end(), row.begin() + (t - f)); // Запись бывшей левой части справа
}

// Вывод массива
for (auto &row : h) {
  for (auto cell : row) { // Здесь ссылка без надобности
    cout << cell << ' ';
  }
  cout << '\n';
} 

Если вводиться будут только сдвиги влево, формула минимально необходимого кол-ва сдвигов упрощается до:

1
 f %= t; 
Аватар пользователя
Высший разум
9мес
123456789101112131415161718192021222324252627282930313233343536373839
 #include <iostream> 
#include <random>

using namespace std;

int main() { 
    constexpr size_t n = 3; 
    int matrix[n][n]{}; 
    uniform_int_distribution<> uid(10, 99); 
    mt19937 gen{ random_device()() }; 
    for (auto& row : matrix) { 
        for (auto& value : row) { 
            value = uid(gen); 
            cout << value << ' '; 
        } 
        cout.put('\n'); 
    } 
    cout.put('\n'); 
    do { 
        auto front = matrix[0][0]; 
        for (size_t i = 0; i < n; ++i) { 
            size_t j = 1; 
            while (j < n) { 
                matrix[i][j - 1] = matrix[i][j]; 
                ++j; 
            } 
            if (i + 1 != n) { 
                matrix[i][n - 1] = matrix[i + 1][0]; 
            } 
        } 
        matrix[n - 1][n - 1] = front; 
        for (const auto& row : matrix) { 
            for (auto value : row) { 
                cout << value << ' '; 
            } 
            cout.put('\n'); 
        } 
    } while (cin.get() != 0x1B);  
}