Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 10

Найти все комбинации последовательностей элементов квадратной матрицы, не лежащих в одной строке и столбце

29.02.2016, 14:52. Показов 724. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Необходима помощь в решении вот какой задачи. Есть квадратная матрица размерности NxN. Нужно найти все варианты последовательностей элементов, расположенных в разных строках и столбцах, т.е. номер строки и столбца должен встречаться только один раз). Частным случаем является последовательность элементов по диагонали ((1,1), (2,2), ..., (N,N)).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.02.2016, 14:52
Ответы с готовыми решениями:

Найти сумму и количество положительных элементов, лежащих выше главной диагонали, в каждом столбце матрицы.
1.Найти количество элементов больших среднего арифметического элементов данного массива. Або 2.Найти сумму и количество положительных...

Найти максимальный элемент и все элементы, расположенные в одной строке и в одном столбце матрицы
Дана квадратная матрица А порядка n. Составить программу, которая находит максимальный элемент и все элементы, расположенные в одной...

Матрицы: найти max элемент и все, расположенные в одной строке и столбце с max, заменить на нули
Дана квадратная матрица А порядка n. Составить программу, которая находит максимальный элемент и все элементы, расположенные в одной...

5
57 / 57 / 37
Регистрация: 11.05.2015
Сообщений: 196
01.03.2016, 11:38
Ну как-то так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
...
const
  n=4;
  Mas: Arrya [1..n] of Arra [1..n] of Byte = ((1,2,3,4),
                                              (4,1,2,3),
                                              (3,4,1,2),
                                              (2,3,4,1));
...
procedure TForm1.Button1Click(Sender: TObject);
var Ar: Array [1..n] of Byte;
  i,j: Byte;
procedure MyInc(var n:Byte);
begin
If n=4 then n:=1 else Inc(n);
end;
procedure ShowMas(mas: Array of Byte);
var i:Byte;
  Buf: String;
begin
For i:=Low(mas) to High(mas) do Buf:=Buf+IntToStr(mas[i])+'; ';
Form1.Memo1.Lines.Add(Buf);
end;
begin
i:=1;
While i<n+1 do
begin
  For j:=1 to n do
  begin
    Ar[j]:=Mas[j,i];
    MyInc(i);
  end;
  Inc(i);
  ShowMas(Ar);
end;
end;
...
Добавлено через 3 часа 57 минут
эм... задачка не из простых, но все же исправил код (прошлый выдавал главные диагонали):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
...
type
  TMas = Array of Array of Byte;
...
const
  n = 4;
  Mas: Array [0..n-1] of Array [0..n-1] of Byte = ((10,11,12,13),
                                                   (14,15,16,17),
                                                   (18,19,20,21),
                                                   (22,23,24,25));
...
Procedure ShowMas(Mas: TMas);
var i,j: Byte;
  Buf: String;
begin
For i:=Low(Mas) to High(Mas) do
begin
  Buf:='';
  For j:=Low(Mas[i]) to High(Mas[i]) do Buf:=Buf+IntToStr(Mas[i,j])+'; ';
  Form1.Memo1.Lines.Add(Buf);
end;
end;
 
Procedure ShowAr(Mas: TMas);
var i,j: Byte;
  Buf: String;
begin
For i:=Low(Mas) to High(Mas) do
begin
  Buf:='';
  For j:=Low(Mas[i]) to High(Mas[i]) do Buf:=Buf+IntToStr(Mas[i,j])+'; ';
  Form1.Memo1.Lines.Add(Buf);
end;
end;
 
function Variant(Mas: TMas): TMas;                                              //Возвращает перечень главных и побочных диагоналей
var BufMas: TMas;
  i,j,k,l: Byte;
begin
If Length(Mas)=2 then                                                           //массив 2х2 (меньше уже смешно, а больше будет сложнее)
begin
  SetLength(Result,2);
  SetLength(Result[0],2);
  SetLength(Result[1],2);
  Result[0,0]:=Mas[0,0];  //Главная
  Result[0,1]:=Mas[1,1];  //диагональ;
  Result[1,0]:=Mas[0,1];  //Побочная
  Result[1,1]:=Mas[1,0];  //диагональ;
end else
begin
  For i:=High(Mas) downto Low(Mas) do                                           //Проходим по первой строчки
  begin
    j:=0;
    k:=0;
    SetLength(BufMas,Length(Mas)-1);
    While j<n do
    begin
      If i<>j then
      begin
        For l:=Low(BufMas) to High(BufMas) do
        begin
          SetLength(BufMas[l],k+1);
          BufMas[l,k]:=Mas[l+1,j];                                              //Генерируем массив N-1xN-1 убирая 1-ую строчку и i-ый столбец
        end;
        Inc(k);
      end;
      Inc(j);
    end;
    BufMas:=Variant(BufMas);                                                    //Передаем сгенерированный массив снова в эту процедуру пока не будет массив 2х2, ну а при 2х2 всего 2 возможные комбинации
    For j:=Low(BufMas) to High(BufMas) do
    begin
      SetLength(Result,Length(Result)+1);
      SetLength(Result[Length(Result)-1],Length(BufMas[j])+1);
      For k:=Low(BufMas[j]) to High(BufMas[j]) do 
        Result[Length(Result)-1,k]:=BufMas[j,k];                                //Добавляем возможные результаты в нашу функцию (функции будут запускаться много раз, самая первая и будет иметь конечный результат, остальные будут иметь результат на усеченные массивы)
      Result[Length(Result)-1,Length(BufMas[j])]:=Mas[0,i];                     //Добавляем в конец результатов предыдущих функций, нашу переменную в i-ом столбце
    end;
  end;
end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var BufMas: TMas;
  i,j: Byte;
begin
SetLength(BufMas,Length(Mas));
For i:=Low(Mas) to High(Mas) do
begin
  SetLength(BufMas[i],Length(Mas[i]));
  For j:=Low(Mas[i]) to High(Mas[i]) do BufMas[i,j]:=Mas[i,j];
end;
BufMas:=Variant(BufMas);
ShowMas(BufMas);
end;
...
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 10
01.03.2016, 18:50  [ТС]
Цитата Сообщение от Rasomaha Посмотреть сообщение
For j:=Low(BufMas) to High(BufMas) do
* * begin
* * * SetLength(Result,Length(Result)+1);
* * * SetLength(Result[Length(Result)-1],Length(BufMas[j])+1);
* * * For k:=Low(BufMas[j]) to High(BufMas[j]) do
* * * * Result[Length(Result)-1,k]:=BufMas[j,k]; * * * * * * * * * * * * * * * *//Добавляем возможные результаты в нашу функцию (функции будут запускаться много раз, самая первая и будет иметь конечный результат, остальные будут иметь результат на усеченные массивы)
* * * Result[Length(Result)-1,Length(BufMas[j])]:=Mas[0,i]; * * * * * * * * * * //Добавляем в конец результатов предыдущих функций, нашу переменную в i-ом столбце
* * end;
* end;
В этом месте программа зацикливается, в итоге вылетает ошибка о нехватке памяти. Не подскажете с чем это может быть связано?

Добавлено через 28 минут
А нет, с этим разобрался. Но в каждом варианте присутствует 10 - элемент первого столбца и строки. И он не всегда вписывается в предлагаемые условия. Видимо он используется как первый элемент последовательности. В итоге ответ оказывается неверным.

Добавлено через 7 минут
И по подсчётам в квадратной матрице 4х4 должно получиться 24 варианта, а программа выдала 14
0
57 / 57 / 37
Регистрация: 11.05.2015
Сообщений: 196
02.03.2016, 09:20
P.S. будут вопросы, задавай

Добавлено через 3 минуты
в обще забыл очистить память, а все остальное работает правильно (и чет форум затупил... так что P.S. в начале=)) приведу только часть функции:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Variant(Mas: TMas): TMas;                                              //Возвращяет перечень главных и побочных диагоналей
var BufMas: TMas;
  i,j,k,l: Byte;
begin
If Length(Mas)=2 then                                                           //массив 2х2 (меньше уже смешно, а больше будет сложнее)
begin
  SetLength(Result,2);
  SetLength(Result[0],2);
  SetLength(Result[1],2);
  Result[0,0]:=Mas[0,0];  //Главная
  Result[0,1]:=Mas[1,1];  //диагональ;
  Result[1,0]:=Mas[0,1];  //Побочная
  Result[1,1]:=Mas[1,0];  //диагональ;
end else
begin
  Setlength(Result,0);  //Я тут забыл очистить память...
  For i:=High(Mas) downto Low(Mas) do                                           //Проходим по первой строчки
...
P.S. будут вопросы, задавай
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 10
02.03.2016, 11:40  [ТС]
Идеально! Огромное спасибо! Теперь всё отлично работает. Извиняюсь за тупые вопросы.
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 10
10.03.2016, 19:20  [ТС]
Rasomaha, можно ли функцию Variant использовать для массива строк? При размерности 2x2 и 3x3 - всё работает, а при 4x4 и дальше - выполняет функцию 2 раза и выдает ошибка об отсутствии доступа к памяти (Access violation).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
type TMas=Array of Array string;
Mas:TMas;
...
SetLength(Mas,d,u)
...
function Variant(Mas: TMas): TMas;
var BufMas: TMas;
  v,c,s,l: integer;
begin
  If Length(Mas)=2 then 
  begin
    SetLength(Result,2);
    SetLength(Result[0],2);
    SetLength(Result[1],2);
    Result[0,0]:=Mas[0,0];
    Result[0,1]:=Mas[1,1];
    Result[1,0]:=Mas[0,1];
    Result[1,1]:=Mas[1,0];
  end else
  begin
    Setlength(Result,0);
    For v:=High(Mas) downto Low(Mas) do begin
      c:=0;
      s:=0;
      SetLength(BufMas,Length(Mas)-1);
      While c<d do begin
        If v<>c then begin
          For l:=Low(BufMas) to High(BufMas) do begin
            SetLength(BufMas[l],s+1);
            BufMas[l,s]:=Mas[l+1,c]; 
          end;
          Inc(s);
        end;
        Inc(c);
      end;
    BufMas:=Variant(BufMas); \\ На эту строку выдаёт ошибку Access violation
    For c:=Low(BufMas) to High(BufMas) do
    begin
      SetLength(Result,Length(Result)+1);
      SetLength(Result[Length(Result)-1],Length(BufMas[c])+1);
      For s:=Low(BufMas[c]) to High(BufMas[c]) do Result[Length(Result)-1,s]:=BufMas[c,s];                                
      Result[Length(Result)-1,Length(BufMas[c])]:=Mas[0,v];
    end;
  end;
end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2016, 19:20
Помогаю со студенческими работами здесь

Найти сумму элементов, лежащих по периметру квадратной матрицы
Задан двумерный массив, состоящий из n строк и n столбцов. Найти сумму элементов, лежащих по периметру.

Найти произведение элементов квадратной матрицы лежащих на побочной диагонали
1.Найти произведение элементов квадратной матрицы лежащих на побочной диагонали.Матрица размером 8*8. 2.Найти сумму элементов того...

Найти произведение элементов квадратной матрицы, лежащих на главной диагонали
2) Составьте блок-схему алгоритма и напишите программу на языке Паскаль. Пользователь должен определить размер массива M. Массив должен...

Найти количество положительных элементов, лежащих на главной диагонали квадратной матрицы
Здравствуйте! Помогите пожалуйста написать программу, сам не могу разобраться(

Найти сумму элементов, лежащих под главной диагональю квадратной матрицы С
Дана матрица 5х5. Найти сумму элементов, лежащих под главной диагональю квадратной матрицы С. Найти вектор, составленный из сумм по...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru