Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ [Pascal]Матрица

Автор: fly 18.04.2007 21:20

Хелпаните с задачкой плз...Задание такое:
Дан массив целых чисел MxM.Вводится произвольный массив чисел KxK.Известно ,что K существенно меньше, чем M.Определить,сколько раз второй массив всречается в первом.

Вот пытался кое что делать.Что я не так делаю?

Код
var k:array[1..100,1..100] of integer;
    m:array[1..100,1..100] of integer;
n,h,i,j:byte;
begin
writeln('vv kol strok');
readln(n);
writeln('vv kol stolbcov');
readln(h);
for i:=1 to h do
end;
begin
writeln('vv',h,'chisel);
for j:=1 to m do
read(a[i,j]);
end;
begin
  even:=true;
  for i:=1 to K do
  for j:=1 to K do
     if M[i+x,j+y]<>K[x,y] then begin even:=false; break;end;
end;
count,i,j:byte;
begin
  count:=0;
  for i:=0 to M-K do
  for j:=0 to M-K do
  if even(i,j) then inc(count);
  writeln(count)
end.

Автор: Tan 18.04.2007 22:12

Объясни пожалуйста поподробней, с примером, что значит

Цитата
Определить,сколько раз второй массив всречается в первом.

Автор: klem4 19.04.2007 1:00

Видимо

K:

1 2
3 4


M:

1 2 5 6 7 8
3 4 4 1 2 3
0 0 0 3 4 4
5 5 2 4 1 5

Ответ: 2 раза.

Автор: fly 23.04.2007 23:28

Klem4 всё верно понял.Нужно посчитать сколько раз массив K встречается в массиве M.

Автор: volvo 23.04.2007 23:49

Ну, пробегай в цикле (в двух, если быть точнее) по большой матрице (строки: 1 .. M-K, столбцы: 1 .. M-K)... Если текущий элемент = элементу малой матрицы с индексами [1, 1], то пробегать по K*K соседним элементам доп. циклами...

Ты хотя бы начни, на самом деле здесь ничего сложного нет...

Автор: Lapp 24.04.2007 6:47

Цитата(fly @ 18.04.2007 18:20) *

Вот пытался кое что делать.Что я не так делаю?

Ты очень многое делаешь не так, трудно перечислить.. smile.gif
Но кое-что ты делаешь все же так. Например, последний цикл, а также следы от функции Even (кстати, почему такое название?..).
Короче, я восстановил программу по твоему тексту (ответь честно - твой он или не твой? странно просто, вроде есть умные мысли, но есть и совершенно глупые ошибки..). Смотри, что получилось:
var
A:array[1..100,1..100] of integer;
B:array[1..100,1..100] of integer;
m,k,i,j:integer;
count:integer;

function Even(x,y:integer):boolean;
var
i,j:integer;
begin
even:=true;
for i:=0 to k-1 do for j:=0 to k-1 do begin
if A[i+x,j+y]<>B[x,y] then begin
even:=false;
break
end
end
end;

begin
m:=4;
k:=2;
{ ... here you input the arrrays}
count:=0;
for i:=1 to M-K+1 do for j:=1 to M-K+1 do if even(i,j) then inc(count);
writeln(count)
end.

Массив я бы либо считывал из файла, либо задавл случайным образом из узкого диапазона (скажем, 0 и 1), тогда вероятность вхождения будет не такая маленькая. Попробуй, если будут сложности - спрашивай. В моем примере матрицы (4х4 и 2х2) получается обе нулевые, так что результат - 9 вхождений, что соответствует истине, как я прикинул.

Автор: Гость 1.05.2007 21:33

Цитата(Lapp @ 24.04.2007 2:47) *

Короче, я восстановил программу по твоему тексту (ответь честно - твой он или не твой? странно просто, вроде есть

Текст не мой а,собранный из разных текстов в один единственный.
В моём случае массив из файла считывать нельзя,мы работу с файлами ещё не изучали.
Я правильно понял что в твоём тексте m-это количество столбцов и строк в массиве "A", а k-это количество столбцов и строк в массиве "B"?



Автор: fly 1.05.2007 21:41

Сори,забыл авторизироваться

Автор: Lapp 2.05.2007 4:08

Цитата(Гость @ 1.05.2007 18:33) *

Я правильно понял что в твоём тексте m-это количество столбцов и строк в массиве "A", а k-это количество столбцов и строк в массиве "B"?

Дык. В соответствии с пожеланиями автора темы (тебя, то бишь) :
Цитата(fly @ 18.04.2007 18:20) *

Дан массив целых чисел MxM.Вводится произвольный массив чисел KxK.

smile.gif

Автор: fly 2.05.2007 16:33

А как сделать так чтобы занчения массива "B" мы вводили сами?

Автор: compiler 2.05.2007 18:07

Цитата(fly @ 2.05.2007 12:33) *
А как сделать так чтобы занчения массива "B" мы вводили сами?
я думаю, надо просто организовать цикл и читать элеменгты..

Автор: fly 2.05.2007 19:14

Хм...Ну вот допустип организовали мы цикл (Поправьте если не правильно).

Код

var
  A:array[1..100,1..100] of integer;
  B:array[1..100,1..100] of integer;
  m,k,i,j:integer;
  count:integer;

function Even(x,y:integer):boolean;
var
  i,j:integer;
begin
  even:=true;
  for i:=0 to k-1 do for j:=0 to k-1 do begin
    if A[i+x,j+y]<>B[x,y] then begin
      even:=false;
      break
    end
  end
end;

begin
  m:=4;
writeln('Вводите размер массива B');
readln(k);
for i:=1 to k do
begin
writeln('Вводите',k,'чисел');
for j:=1 to k do
read(B[i,j])
end;

А дальше что?Как чиать элементы?

Автор: compiler 2.05.2007 19:56

Цитата(fly @ 2.05.2007 15:14) *
А дальше что?Как чиать элементы?

for i:=0 to k-1 do begin
for j:=0 to s-1 do begin
Write('...');
ReadLn(B[i,j]);
end;
end;
вот, там под себе подделаеш, все ясно?

Автор: fly 2.05.2007 23:43

Разобрался)))
Спасибо всем за помощь))