Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2007, 20:59   #1
Imperceptible
Пользователь
 
Регистрация: 10.02.2007
Сообщений: 14
Вопрос Двумерный массив help

Путём перестановки элементов квадратной матрицы добиться того,чтобы её максимальный элемент был в левом верхнем углу, следующий по велечине впозиции (2,2) следующий (3,3) и т д
Заполнить так всю главную диагональ.

Получается только так: вся главная диагональ забивается максимальным элементом и всё, хоть и делал обнуление максимального после его нахождения и помещения в нужную позицию

Использовал вспомогательный массив, хоть это и не желательно (ведь требуется перестановкой изменить его ), иначе вообще нет идей...подскажите что делать??
Imperceptible вне форума Ответить с цитированием
Старый 10.02.2007, 22:19   #2
Time
Пользователь
 
Регистрация: 09.02.2007
Сообщений: 32
По умолчанию

Один из вариантов:
Пусть дана матрица с n строками и n столбцами.
Надо перебрать все элементы матрицы и найти максимальный.
Сначала перебираем все элементы двухмерной матрицы кроме тех которые стоят по диагонале, находим максимальный. Далее продолжаем искать максимальный перебором только тех элементов, которые стоят по диагонале, начиная с k-ого (k в начале равно 1). Получили максимальный элемент матрицы (Запомнили не сам элемент а его координаты i-тою и j-тою по строке и постолбцу). Переставляем местами этот элемент с элементом, который стоит в k-той строке и k-ом столбце. Далее увеличиваем k на единицу. Повторяем всё выше сказанное n раз.
И всё готово!
Time have not meaning, mind - this is main...
Time вне форума Ответить с цитированием
Старый 10.02.2007, 22:33   #3
Imperceptible
Пользователь
 
Регистрация: 10.02.2007
Сообщений: 14
По умолчанию

Что-то не получается у меня вышесказанное закодировать...
Очень прошу код если можно, тупняк у меня.
Imperceptible вне форума Ответить с цитированием
Старый 10.02.2007, 22:38   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Алгорит достаточно прост.
1) Загоянешь символы в одномерный массив
2) Любым алгоритмом сортировки производишь сортирование символов
3) Перегон осортированного одномерного массива в двумерный массив - матрицу.
Alar вне форума Ответить с цитированием
Старый 10.02.2007, 22:42   #5
Imperceptible
Пользователь
 
Регистрация: 10.02.2007
Сообщений: 14
По умолчанию

О, спасибо, а когда обратно загоняешь в двумерный на стадии 3) как заполнив сначала диагональ сделать так, чтобы потом пошло заполнение всего остального кроме диагоналии?
Imperceptible вне форума Ответить с цитированием
Старый 10.02.2007, 23:32   #6
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от Imperceptible Посмотреть сообщение
О, спасибо, а когда обратно загоняешь в двумерный на стадии 3) как заполнив сначала диагональ сделать так, чтобы потом пошло заполнение всего остального кроме диагоналии?
Наверное ты уже всё сделал, кроме заполнения. Так - диагональ заполнил.делаешь два цикла, один в другом. И проверяешь, если это диагональ, то добавлять не надо.

посмотри набросок, может поможет.


счётчик:=колличество клеток в диагонали+1;
for i:=1 то длина do
begin
for j:=1 то длина do
begin
if i=j tnen goto a;
двухмерныймассив[i,j]:=одномерныймассив[счётчик];
счётчик:=счётчик+1;
a:
end;
end;
Alar вне форума Ответить с цитированием
Старый 10.02.2007, 23:41   #7
Imperceptible
Пользователь
 
Регистрация: 10.02.2007
Сообщений: 14
По умолчанию

А если в виде процедуры оформить это, в описании процедуры можно метки использовать?
Imperceptible вне форума Ответить с цитированием
Старый 10.02.2007, 23:42   #8
Time
Пользователь
 
Регистрация: 09.02.2007
Сообщений: 32
По умолчанию

a - двухмерная матрица, n - количество строк
Цитата:
maxi := 1;
maxj := 1;
max := a[1,1];
for k := 1 to n do begin
for i := 1 to n do
for j := 1 to n do
If (a[i,j] > max) and (i <> j) then
begin
maxi := i;
maxj := j;
max := a[i,j];
end;
for i := k to n do
if a[i,i] > max then
begin
maxi := i;
maxj := i;
max := a[i,i];
end;
ram := a[maxi,maxj]; a[maxi,maxj] := a[k,k]; a[k,k] := ram;
end;
В моей проге используется именно алгоритм перестановки без вспомогательного массива. Если тебе это не обязательно, то можешь сделать так как сказал Alar
Time have not meaning, mind - this is main...

Последний раз редактировалось Time; 10.02.2007 в 23:44.
Time вне форума Ответить с цитированием
Старый 10.02.2007, 23:43   #9
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от Imperceptible Посмотреть сообщение
А если в виде процедуры оформить это, в описании процедуры можно метки использовать?
в процедуре можно использовать метки. и в функции тоже.
Alar вне форума Ответить с цитированием
Старый 10.02.2007, 23:48   #10
Imperceptible
Пользователь
 
Регистрация: 10.02.2007
Сообщений: 14
По умолчанию

А вот это, с использованием буферной памяти, какраз то что нужно!
Благодарю, грамотный ход.
Imperceptible вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный Массив n01R Помощь студентам 9 19.12.2009 16:41
Двумерный массив... slim5 Помощь студентам 2 20.06.2008 23:16
Двумерный массив в С++ Draid Помощь студентам 2 07.03.2008 22:06
Двумерный массив Jodu Помощь студентам 18 05.12.2007 22:44