Нужно сдвинуть двумерный массив
Исходный массив:
0,0,0,0,0
1,0,1,1,0
1,1,1,1,1
1,1,1,1,1
0,1,0,0,0
1,1,1,1,1
0,1,1,0,1
Нужно получить:
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
1,0,1,1,0
0,1,0,0,0
0,1,1,0,1
Другие языки программирования и технологии
C++ сдвиг массива
По заданию получается, что нужно сдвинуть строку с 4 индексом на 5, строки 0 и 1 перенести на 3, а "верх" забить "нулями".
#include "iostream"
#include "iomanip"
#include "cstring"
using namespace std;
void outIntArr(ostream& s, void* p, size_t m, size_t n) {
int *tmp = (int*)p;
for(int i=0;i<m;i++) {
for(int j=0;j<n; j++,tmp++)
s << setw(4) << *tmp;
s << endl;
}
}
int main() {
const size_t m=7, n = 5;
int a[m][n] = {
{0,0,0,0,0}, //0
{1,0,1,1,0}, //1
{1,1,1,1,1}, //2
{1,1,1,1,1}, //3
{0,1,0,0,0}, //4
{0,1,1,1,1}, //5
{0,1,1,0,1} //6
};
outIntArr(cout, a, m, n);
cout << "-----" << endl;
//4 -> 5
memcpy((int*)&a + 5*n, (int*)&a + 4*n, n*sizeof(int));
//0,1 -> 3,4
memcpy((int*)&a + 3*n, &a, 2*n*sizeof(int));
//0-2 = 0
memset(&a, 0, 3*n*sizeof(int));
outIntArr(cout, a, m, n);
return 0;
}
----

#include "iostream"
#include "iomanip"
#include "cstring"
using namespace std;
void outIntArr(ostream& s, void* p, size_t m, size_t n) {
int *tmp = (int*)p;
for(int i=0;i<m;i++) {
for(int j=0;j<n; j++,tmp++)
s << setw(4) << *tmp;
s << endl;
}
}
int main() {
const size_t m=7, n = 5;
int a[m][n] = {
{0,0,0,0,0}, //0
{1,0,1,1,0}, //1
{1,1,1,1,1}, //2
{1,1,1,1,1}, //3
{0,1,0,0,0}, //4
{0,1,1,1,1}, //5
{0,1,1,0,1} //6
};
outIntArr(cout, a, m, n);
cout << "-----" << endl;
//4 -> 5
memcpy((int*)&a + 5*n, (int*)&a + 4*n, n*sizeof(int));
//0,1 -> 3,4
memcpy((int*)&a + 3*n, &a, 2*n*sizeof(int));
//0-2 = 0
memset(&a, 0, 3*n*sizeof(int));
outIntArr(cout, a, m, n);
return 0;
}
----

#include <iostream>
#include <vector>
#include <list>
#include <Windows.h>
using namespace std;
typedef vector<short> line;
typedef list<line> tetris;
void show(tetris& game);
void print(const line& level);
void sealed(tetris& game);
void delay(DWORD ms);
class full_line : unary_function<line, bool> {
public:
bool operator() (line& level);
};
int main() {
tetris game = {
{ 0, 0, 0, 0, 0 },
{ 1, 0, 1, 1, 0 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 1 },
{ 0, 1, 1, 0, 1 }
};
show(game);
delay(1000);
sealed(game);
show(game);
cin.get();
}
void show(tetris& game) {
for (const auto &level : game) print(level);
}
void print(const line& level) {
for (const auto &cell : level) cout << ' ' << cell;
cout << endl;
}
void sealed(tetris& game) {
line zero = { 0, 0, 0, 0, 0 };
auto size = game.size();
game.remove_if(full_line());
while (game.size() != size) game.push_front(zero);
}
void delay(DWORD ms) {
Sleep(ms);
system("cls");
}
bool full_line::operator() (line& level) {
for (const auto &cell : level) if (!cell) return false;
return true;
}
#include <vector>
#include <list>
#include <Windows.h>
using namespace std;
typedef vector<short> line;
typedef list<line> tetris;
void show(tetris& game);
void print(const line& level);
void sealed(tetris& game);
void delay(DWORD ms);
class full_line : unary_function<line, bool> {
public:
bool operator() (line& level);
};
int main() {
tetris game = {
{ 0, 0, 0, 0, 0 },
{ 1, 0, 1, 1, 0 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 1 },
{ 0, 1, 1, 0, 1 }
};
show(game);
delay(1000);
sealed(game);
show(game);
cin.get();
}
void show(tetris& game) {
for (const auto &level : game) print(level);
}
void print(const line& level) {
for (const auto &cell : level) cout << ' ' << cell;
cout << endl;
}
void sealed(tetris& game) {
line zero = { 0, 0, 0, 0, 0 };
auto size = game.size();
game.remove_if(full_line());
while (game.size() != size) game.push_front(zero);
}
void delay(DWORD ms) {
Sleep(ms);
system("cls");
}
bool full_line::operator() (line& level) {
for (const auto &cell : level) if (!cell) return false;
return true;
}
Ну сдвиньте в цикле, переставляя на 3 вниз. Или чё там делается? Чё-то не понял.
Похожие вопросы
- C++ Двухмерный массив с случайными не повторяющимися числами.
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- c#. Сортировка массива в отдельном методе. Консольное приложение.
- C++ одномерный массив
- C++, безразмерный массив
- Как в C# инициализировать массив в свойстве класса?
- C# Дан массив размера N. Найти 2 элемента массива, сумма которых наиболее близка к максимуму массива и поменять
- Нужно перемешать массив на C++. Есть массив, его нужно случайным образом перемешать. Нужен именно КОД, а не алгоритм
- Помогите решить задачу на C++. Двумерные массивы.
- c++ динамический массив