0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
1

Работа с трехмерными массивами (векторами)

06.09.2015, 19:34. Показов 3282. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, помогите пожалуйста разобраться с работой с трехмерными массивами.

Есть задачка: пятнашки, поле 3х3
1 8 4
6 7 3
0 2 5
Найти за какое наименьшее число ходов можно привести любое, рандомно перемешанное поле (например вверху) к эталону (внизу).
0 1 2
3 4 5
6 7 8
Нолик - пустая клетка, которая может меняться местами с соседними.

Что, собственно, я удумал:

Создаем переменную для количества шагов.
Создаем трехмерный массив (массив матриц), запихиваем туда наше перемешанное поле.
Создаем бесконечный цикл.
В нём, первым делом, проверяем все матрицы из трехмерного массива на соответствие эталону (при соответствии - выводим число шагов и выходим из цикла).
Дальше мы "делаем шаг" - меняем 0 местами с соседями и загоняем новую(ые) матрицы в трехмерный массив.
Делаем шаг+1.
Конец цикла.

Собственно вопрос: как реализовать трехмерный массив, так, чтобы в него можно было добавлять новые матрицы в цикле, и как организовать цикл для проверки на соответствие эталону?

Добавлено через 6 минут
Я думал, что проще всего сделать через вектор векторов векторов.
C++
1
 vector< vector< vector< short > > > fields;
Но я не разбираюсь в работе с ним, как его заполнять и как в нем делать push_back() ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2015, 19:34
Ответы с готовыми решениями:

Приложение-калькулятор для работы с трехмерными векторами
Помогите, пожалуйста: Разработать приложение, с помощью которого можно выполнять арифметические...

С трехмерными массивами Маткад умеет работать?
С трехмерными массивами Маткад умеет работать? У меня стоит Mathcad 15.0. Вот пример. Он вроде и...

Работа с трехмерными поверхностями
Помогите пожайлуста! Нужно в режиме 320х200 точек на 256 цветов вывести трехмерную конструкцию,...

Написать функцию, которая линеаризует список с подсписками и одномерными массивами (векторами)
Помогите, пожалуйста.

14
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
06.09.2015, 19:41 2
AlKp, а почему нельзя обойтись двумерным массивом(матрицей)?
P.S. Лучше попросите модератора перенести тему в алгоритмы.
0
0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
06.09.2015, 19:51  [ТС] 3
А как обойтись двумерным массивом?
Я просто это представлял так.
У нас есть матрица:
1 8 4
6 7 3
0 2 5
Мы делаем все возможные шаги, и у нас уже 2 матрицы:
1 8 4 --- 1 8 4
6 7 3 --- 0 7 3
2 0 5 --- 6 2 5
На следующей итерации еще больше:
1 8 4 --- 1 8 4 --- 0 8 4 --- 1 8 4
6 0 3 --- 6 7 3 --- 1 7 3 --- 7 0 3
2 7 5 --- 2 5 0 --- 6 2 5 --- 6 2 5
И дальше их количество будет расти и нам надо их запоминать, чтоб потом делать новые шаги.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
06.09.2015, 20:02 4
Цитата Сообщение от AlKp Посмотреть сообщение
А как обойтись двумерным массивом?
А почему вы у меня об этом спрашиваете? Я когда в тему заходил,думал вопрос по C++ =)
Скорей всего здесь возможно более тонкое решение чем тупой перебор.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,624
06.09.2015, 20:07 5
vector'ы вложенные используй для массива. Там поддерживается операция сравнения ==.

Добавлено через 1 минуту
Только тебе 4 измерения надо.
0
0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
06.09.2015, 20:20  [ТС] 6
Спасибо, а почему 4 измерения и как его заполнять и как в нем делать push_back() ?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,624
06.09.2015, 20:27 7
Ну первое измерение - шаг (уровень в дереве), второе - ход (на данном уровне), остальные - координаты.
Просмотр же будет параллельный, а не каждую ветвь в отдельности. Я правильно понимаю?
А что с push_back()? Будешь двумерными оперировать внутри.

Добавлено через 2 минуты
И сравнивать придётся не только с финальной расстановкой, но и со всеми промежуточными, чтобы исключить повторения, а то можно до бесконечности гонять этот ноль.
0
11 / 9 / 6
Регистрация: 16.08.2013
Сообщений: 36
06.09.2015, 20:27 8
1-е решение:нужно максимум два массива:
первый для хранения массива перед ходом.
второй для временного перемещения данных.
После хода второй копируете в первый.
2-е решение: нужен всего один массив и временная переменная куда будете помещать заменяемый элемент массива, иначе его потеряете.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,624
06.09.2015, 20:32 9
Нет, нужно хранить всю последовательность, иначе как узнать, какие ходы уже были?
0
0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
06.09.2015, 20:53  [ТС] 10
Хорошо, а можете расписать как работать с трехмерным вектором, или дать ссылку на примеры? А то я вкурить не могу.

C++
1
2
3
4
5
6
7
vector< vector< vector< short > > > fields; 
fields.resize(1);
fields[0].resize[3];
for (int i=0; i<3; i++)
{
     fields[0][i].resize[3];
}
как теперь добавить еще одну матрицу 3х3 в конец?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,624
06.09.2015, 21:21 11
Лучший ответ Сообщение было отмечено AlKp как решение

Решение

Вот первоначальное заполнение:
C++
1
2
3
4
5
6
7
8
9
10
11
int f0[3][3] = {{1, 8, 4}, {6, 7, 3}, {0, 2, 5}};
vector<vector<int>> f;
f.resize(3);
for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j)
        f[i].push_back(f0[i][j]);
 
vector< vector< vector< vector< int > > > >fields;
fields.resize(1);
fields[0].resize(1);
fields[0][0].push_back(f);
Вот построение:
C++
1
2
3
4
5
6
7
8
9
10
11
for (int i = 1; ; ++i) // шаги
{
    fields.resize(i + 1);
    
    for (int j = 0; j < fields[i - 1].size(); ++j) // варианты предыдущего шага
    {
        f = fields[i - 1][j];
        // сделать перестановку в f
        fields[i].push_back(f); // добавить новый ход на текущем шаге
    }
}
Там, где перестановка, должен быть цикл, который все ходы добавляет. Плюс сравнения.
1
0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
06.09.2015, 21:45  [ТС] 12
Спасибо
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.09.2015, 22:01 13
Цитата Сообщение от S_el Посмотреть сообщение
а почему нельзя обойтись двумерным массивом(матрицей)?
А почему одномерным нельзя-то, куда записать матрицу, прочитанную, например, по строкам?
0
0 / 0 / 0
Регистрация: 06.09.2015
Сообщений: 6
06.09.2015, 22:09  [ТС] 14
Нужны строки и столбцы, чтобы удобно менять нолик с ближайшими соседями а не делать это методом велосипедных костылей.
Хотя я тут новичок, если покажите как правильно - я поверю и буду делать так.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
06.09.2015, 22:29 15
Цитата Сообщение от Mr.X Посмотреть сообщение
А почему одномерным нельзя-то, куда записать матрицу, прочитанную, например, по строкам?
Можно и одномерным.Дело в алгоритме,а не представлении данных.
0
06.09.2015, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2015, 22:29
Помогаю со студенческими работами здесь

Работа с трехмерными примитивами. Вокруг конуса GLU вращаются сфера GLUT и конус GLUT
создание виртуальной камеры gluLookAt и добавление эффектов анимации. вот само задание Вокруг...

Работа с векторами
Всем доброго времени суток. У меня имеется не большая проблема с векторами. Я люблю поиграть в...

Работа с векторами
Суть проги: В векторе a(n) найти минимальный элемент и поменять его местами с последним элементом....

Работа с векторами
Всем привет. Посмотрел, что такое вектор, понял, что это удобная штука) Но ещё не совсем понял...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru