Здравствуйте!
Очень срочно нужна ваша помощь. Дан двумерный массив [1..m,1..n]. Нужно сравнить строки так: 1 со всеми, 2 со всеми и т.д. и для каждого написать число не совпадений. У меня все идеи не удались. Получается ОЧЕНЬ громоздко. Если будут хоть какие-то идеи, буду благодарна.
моя идея была в том, что бы тупо каждый раз запускать цикл for и проверять все по отдельности a[i,j]=a[i+1,j] и т.д. Но это же глупость!!! я начинающий и мне кажется, что я просто чего-то не знаю, что могло бы мне помочь при решении этой проблемы. поэтому и написала, что нужна идея,а не код. Помогите, если знаете, как делать.
Понимаешь, в чем дело... Ты не дала достаточно информации, чтобы можно было помочь тебе в решении этой задачи. На данный момент - вопросов больше, чем ответов: Можно ли использовать дополнительную память? Обязана ли исходная матрица остаться неизменной, или она может измениться? Можно ли пользоваться подпрограммами?
Если доп. память использовать можно (или не обязательно сохранять матрицу в том виде, в котором ее получила) - возьми, отсортируй ее любым методом и за один проход посчитаешь количество повторений каждого элемента, никаких вложенных циклов.
А вообще, неплохо было бы знать конечную цель всех этих махинаций с подсчетами, а то очень напоминает http://gunsmoker.blogspot.com/2008/10/x-y-z.html - задача может решаться совсем не так, как ты это себе представляешь...
Можно ли использовать дополнительную память?(если необходимо, то можно)
Обязана ли исходная матрица остаться неизменной, или она может измениться?(изменяться она не должна. если отличий 2-х строк только 1, то в новую матрицу записывается 1 строка-копия тех, которые сравнивали, но на месте отличия пишется любой другой знак)т.е было 23456 и 23457==>23450. в итоге получается новая матрица с нулями на тех местах, где 1 отличий.
Можно ли пользоваться подпрограммами?(да)
еще ужаснее это то, что с новой матрицей происходит тоже самое. и это все до тех пор, пока не останется матрица со строками, которые имеют больше чем 1 отличий.
Добавлено через 11 мин.
а нужна мне старая матрица для того, что бы:
старая матрица
0001
0010
0011
1001
1010
1011
новая
2021
2012(на месте двоек отличия) их 2 потому что сравнивали строки несколько раз.
и получается
101101
011011(матрица покрытия)1-если строка новой матрицы входит в строку старой. 0-наоборот.
вот для этого мне и надо понять, как сравнивать строки.
Всем еще раз привет.
readln(k);
n:=round(exp(ln(2)*k));
k:=k+1;
for i:=1 to n do
begin
for j:=1 to k do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln;
end;
m:=0;
for i:=1 to n do begin
if a[i,k]=1 then m:=m+a[i,k];
end;
for i:=1 to n do
if a[i,k]=1 then
begin
for r:=1 to m do
for j:=1 to k do
g[r,j]:=a[i,j];
end;
for r:=1 to m do
begin
for j:=1 to k do
begin
write('g[',r,',',j,']=',g[r,j]);
end;
writeln;
end;
end.
constВ результате имеем:
max_vars = 5;
var
k, n, i, j: integer;
T, equalOne: integer;
a: array[1 .. 1 shl max_vars, 1 .. max_vars + 1] of integer;
begin
repeat
readln(k);
if k > max_vars then writeln('неверное значение. Попробуйте еще раз');
until k <= max_vars;
n := 1 shl k;
for i := 1 to n do
begin
T := i - 1;
for j := k downto 1 do
begin
a[i, j] := T mod 2;
T := T div 2;
// Здесь можно устанавливать и значения F для строки №i:
a[i, k + 1] := i mod 2; // я просто установил F как признак нечетности строки...
end;
end;
equalOne := 0;
// собственно вывод таблицы истинности:
for i := 1 to n do
begin
for j := 1 to k do
write(a[i, j]:2);
write(a[i, k+1]:4); // Выводим F
if a[i, k+1] = 1 then inc(equalOne);
writeln;
end;
writeln('единичных значений F - ', equalOne, ' шт.');
end.