Требуется определить общую формулу для чисел в ячейках матрицы `n times n` через соответствующие координаты ячеек `i` и `j`, где `i,j={0,1,2,...,n-1}`, при условии что числа последовательные и начинаются с 1. Пример, матрица 3x3 123 456 789
Груша Вильямс, как говорит All_ex, методом пристального вглядывания)) 123 456 789 Мы видим, что для матрицы 3х3 элементы можно записать как: 0*3+1 0*3+2 0*3+3 1*3+1 1*3+2 1*3+3 2*3+1 2*3+2 2*3+3
Дилетант, мощно конечно)) читать дальшеДа с этим поиском в ширину сижу всё, пытаюсь придумать как по-человечески его написать. Проблема в том, что у меня идёт проверка каждой клетки, например, для 3x3, 9 проверок на возможный шаг, например, тот что под номером 2, затем опять 9 проверок на третий шаг и т.д. Просто ужасно, получается в общем случае n^2 проверок на шаг. А ужас ещё и в том, что у нас все так написали, где-то 50 человек Хотя очевидно, что достаточно всего четырех проверок ведь начало то известно, а значит проверяем только соседей. Вот и пытаюсь что-то придумать. Идея следующая: создать еще одну матрицу, такую как тут (формула нужна собственно для того, чтоб не вручную числа в матрицу забивать, а по формуле в цикле), тогда у нас есть связь по и жи с исходной (попадаем в ту же ячейку) и с элементами самой матрицы(которые опять же имеют связь по и жи), потом думаю одномерный массив делать(там как раз эти 1,2,3, и тд) и между всеми этими вещами как-то манипулировать
Эллипс - это круг, который можно вписать в квадрат 25х40
Груша Вильямс, Да с этим поиском в ширину сижу всё, пытаюсь придумать как по-человечески его написать. когда-то на первом курсе писал программу с поиском в ширину... правда мне не число вариантов надо было искать, а просто кратчайший путь, но можно его модифицировать... использовал динамический массив ... Заполняете матрицу нулями, а клетку начала единицей... и создаёте массив, котором сначала пишите номера (сточка;столбик) соседних с началом клеток... Далее берёте элемент из очереди и добавляете в конец очереди её соседей с нулями... а в матрице для этой клетки пишите сумму всех соседей (их не более четырёх... тут нули ничего не испортят, а предшественники просуммируются)... Далее этот элемент удаляется из очереди... так поступаете до тех пор пока не заполните клетку окончания...
All_ex, хотелось бы без динамического массива, т.к. опыт работы с ним вблизи нуля, с другой стороны не так уж и отличается от обычного массива, а потому можно же и обычный объявить на n^2 элементов, чтоб наверняка? Переписать на динамический потом если что думаю проще пареной репы будет. Но честно говоря я так и не понял как это делают...и создаёте массив, котором сначала пишите номера (сточка;столбик) соседних с началом клеток то есть двумерный массив на 4 координаты правильно понимаю? Далее берёте элемент из очереди и добавляете в конец очереди её соседей с нулями а очередь это одномерный массив? Если да, то при инициализации туда нули пишем?
Эллипс - это круг, который можно вписать в квадрат 25х40
Груша Вильямс, непонятно, почему углы заполнены двойками...
У Вас есть заполненная `(-1)` матрица (символ того, что клетки ещё не осмотрены...... и пока пустой одномерный массив... Сначала в угол (начальная точка) ставится 1, а в очередь ставятся клетки `[1;0]` и `[0;1]` - попутно заполняя матрицу нулями на этих местах... `((1,0,-1), (0,-1,-1), (-1,-1,-1))` и `([1;0]; \ [0;1])`...
Теперь берём первую клетку из очереди - (1;0) - и добавляем в очередь её соседей с минус единицами - `([0;1] ; \ [2;0]; \ [1;1])`... Добавленные клетки заполняем нулями в матрице... `((1,0,-1), (0,0,-1), (0,-1,-1))`... и вычисляем сумму допустимых соседей для `[1;0]` ... `((1,0,-1), (1,0,-1), (0,-1,-1))`...
All_ex, я Вас понял, подправил немного только У Вас есть заполненная `(-1)` матрица (символ того, что клетки ещё не осмотрены...... и пока пустой одномерный массив... Сначала в угол (начальная точка) ставится 1, а в очередь ставятся клетки `[1;0]` и `[0;1]` - попутно заполняя матрицу нулями на этих местах... `((1,0,-1), (0,-1,-1), (-1,-1,-1))` и `([1;0]; \ [0;1])`...
Теперь берём первую клетку из очереди - (1;0) - и добавляем в очередь её соседей с минус единицами - `([0;2] ; \ [2;0]; \ [1;1])`... Добавленные клетки заполняем нулями в матрице... `((1,0,0), (0,0,-1), (0,-1,-1))`... и вычисляем сумму допустимых соседей для `[1;0]` ... `((1,0,0), (1,0,-1), (0,-1,-1))`... И так далее... Но как это написать пока не знаю) Зато придумал следующее: - делаем функцию соседей(нэйбос по англ поэтому nerb назвал хотя пишется neighbors) (в ее задачу входит принять координаты старта, проверить соседей, поставить волны и слить их координаты в массив); - теперь у нас есть массив с координатами и надо бы их как-то скармливать этой функции. По сути рекурсия -- отправили координаты, получили новые, отправили их, опять получили новые и так до тех пор пока пустые соседи есть.
Первый шаг отлично вот выводит, только не понятно как вот тут сейчас иксу присвоить дэйта[1][0], а игрику дэйту[1][1] и в вайл бы прямо тут)
непонятно, почему углы заполнены двойками... а в пэйнте я сам их на автомате расставил DD Можно считать это концом работы алгоритма)
Эллипс - это круг, который можно вписать в квадрат 25х40
Ну, на мой взгляд сразу создавать весь массив не шибко рационально... ведь конечная клетка может попасться не последней... хотя если интересует вопрос о числе кратчайших путей от начальной до любой, то перебирать всё равно придётся ...
С рекурсией - тоже не понял пока идеи... ... если Вы уже создали массив, то идёт просто перебор по всем клетками по очереди...
но всё же...Но по итогу я бы рекомендовал познакомится с динамическими массивами... сложного там ничего нет... Правда, я это делал 27 лет назад, и уже сам немного подзабыл порядок описания... Создаёте новый тип, в котором есть поле со значением, и ссылка на массив ссылок (на соседей)... тут вам первое удобство - если ссылки на соседа нет, значит переход заблокирован... а, во-вторых, можно рассматривать произвольные графы, а не только матрицы... ведь алгоритм поиска никак не изменится...
Затем всё по описанному выше алгоритму... начальная клетка заполнена.... создали "очередь" из её соседей... у соседей нарисовали нули... Дальше идёт цикл по "очереди соседей", пока очередь не закончится... тут делаете три действия: 1) добавляем новых соседей в очередь, 2) обнуляем значения новых соседей, 3) вычисляем сумму для рассматриваемой клетки (тут просто суммируем по всем ссылкам на соседей) ... переходим к новому элементу очереди...
All_ex, создавать весь массив не шибко рационально... да я пока хочу просто осуществить это, выражаясь математически - показать, что код существует)) С рекурсией - тоже не понял пока идеи... а вот кстати написать удалось, правда штук 8 глобальных переменных добавить пришлось, но насколько я понимаю пока программирование, то если пишется на глобальных, значит пишется и на локальных, правда писал программы только по учебе и всегда вроде бы удавалось и так, и эдак. Собственно упростить код ещё не пытался (то есть полностью согласен, что он мягко говоря сыроват) и, более того, на правильность не проверял, но вроде б работает Рекурсия
Эллипс - это круг, который можно вписать в квадрат 25х40
Груша Вильямс, Собственно упростить код ещё не пытался (то есть полностью согласен, что он мягко говоря сыроват) Честно признаться, я так и не выучил С++ (писал на паскале)... ... поэтому с моей стороны тут критики нет...
Вы вот про эту формулу?
`a_{ij}=n*i+(j+1)`
123
456
789
Мы видим, что для матрицы 3х3 элементы можно записать как:
0*3+1 0*3+2 0*3+3
1*3+1 1*3+2 1*3+3
2*3+1 2*3+2 2*3+3
Ну и делаем выводы )
Ага. Пришла исправить, но не успела )))
читать дальше
когда-то на первом курсе писал программу с поиском в ширину... правда мне не число вариантов надо было искать, а просто кратчайший путь, но можно его модифицировать... использовал динамический массив ...
Заполняете матрицу нулями, а клетку начала единицей... и создаёте массив, котором сначала пишите номера (сточка;столбик) соседних с началом клеток...
Далее берёте элемент из очереди и добавляете в конец очереди её соседей с нулями... а в матрице для этой клетки пишите сумму всех соседей (их не более четырёх... тут нули ничего не испортят, а предшественники просуммируются)...
Далее этот элемент удаляется из очереди... так поступаете до тех пор пока не заполните клетку окончания...
простите, если объяснил опять неуклюже...
У Вас есть заполненная `(-1)` матрица (символ того, что клетки ещё не осмотрены...... и пока пустой одномерный массив...
Сначала в угол (начальная точка) ставится 1, а в очередь ставятся клетки `[1;0]` и `[0;1]` - попутно заполняя матрицу нулями на этих местах...
`((1,0,-1), (0,-1,-1), (-1,-1,-1))` и `([1;0]; \ [0;1])`...
Теперь берём первую клетку из очереди - (1;0) - и добавляем в очередь её соседей с минус единицами - `([0;1] ; \ [2;0]; \ [1;1])`...
Добавленные клетки заполняем нулями в матрице... `((1,0,-1), (0,0,-1), (0,-1,-1))`... и вычисляем сумму допустимых соседей для `[1;0]` ... `((1,0,-1), (1,0,-1), (0,-1,-1))`...
И так далее...
У Вас есть заполненная `(-1)` матрица (символ того, что клетки ещё не осмотрены...... и пока пустой одномерный массив...
Сначала в угол (начальная точка) ставится 1, а в очередь ставятся клетки `[1;0]` и `[0;1]` - попутно заполняя матрицу нулями на этих местах...
`((1,0,-1), (0,-1,-1), (-1,-1,-1))` и `([1;0]; \ [0;1])`...
Теперь берём первую клетку из очереди - (1;0) - и добавляем в очередь её соседей с минус единицами - `([0;2] ; \ [2;0]; \ [1;1])`...
Добавленные клетки заполняем нулями в матрице... `((1,0,0), (0,0,-1), (0,-1,-1))`... и вычисляем сумму допустимых соседей для `[1;0]` ... `((1,0,0), (1,0,-1), (0,-1,-1))`...
И так далее...
Но как это написать пока не знаю)
Зато придумал следующее:
- делаем функцию соседей (в ее задачу входит принять координаты старта, проверить соседей, поставить волны и слить их координаты в массив);
- теперь у нас есть массив с координатами и надо бы их как-то скармливать этой функции.
По сути рекурсия -- отправили координаты, получили новые, отправили их, опять получили новые и так до тех пор пока пустые соседи есть.
Первый шаг отлично вот выводит, только не понятно как вот тут сейчас иксу присвоить дэйта[1][0], а игрику дэйту[1][1] и в вайл бы прямо тут)
непонятно, почему углы заполнены двойками...
хотя если интересует вопрос о числе кратчайших путей от начальной до любой, то перебирать всё равно придётся ...
С рекурсией - тоже не понял пока идеи...
но всё же...
С рекурсией - тоже не понял пока идеи... а вот кстати написать удалось, правда штук 8 глобальных переменных добавить пришлось, но насколько я понимаю пока программирование, то если пишется на глобальных, значит пишется и на локальных, правда писал программы только по учебе и всегда вроде бы удавалось и так, и эдак. Собственно упростить код ещё не пытался (то есть полностью согласен, что он мягко говоря сыроват) и, более того, на правильность не проверял, но вроде б работает
Рекурсия
Честно признаться, я так и не выучил С++ (писал на паскале)...