


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;
}
}
Если бы ты дал текст задания, которое пытаешься решить, было бы куда проще.
Судя по коду, ты делаешь циклический сдвиг элементов строк массива влево - отдельно каждую строку. Но циклический сдвиг - это просто перестановка двух частей массива местами.
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';
}
Если вводиться будут только сдвиги влево, формула минимально необходимого кол-ва сдвигов упрощается до:
f %= t;
#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);
}