Przesunięcie sumy kwadratu tablicy

Callan-Grey
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 4 gru 2006, o 20:39
Płeć: Mężczyzna
Lokalizacja: Katowice
Podziękował: 8 razy
Pomógł: 3 razy

Przesunięcie sumy kwadratu tablicy

Post autor: Callan-Grey »

Witam:) Mam pewien problem w Pascalu, mianowicie:

Program ma polegać na tym, że użytkownik podaje boki tablicy dwuwymiarowej, z której ma być wydzielony największy możliwy kwadrat, a liczby w środku mają być sumowane. Niby nic trudnego, ale pojawia się pewien problem. Zakładając że user podał tablicę np o boku 3 na 2 to tych kwadratów będzie 2 i sumy z ich środków należy porównać a następnie wybrać tę większą. Kompletnie nie mam pojęcia w jaki sposób to zrobić. Tzn. Mój pomysł polegał na tym, aby wyniki wbić do drugiej tablicy, tym razem jedno wymiarowej a następnie je w ramach tej tablicy porównać. Niestety nie wiem jak to napisać. Wkleję część kodu:

Kod: Zaznacz cały

read(x);
writeln('Podaj drugi bok');
read(y);
writeln('Podaj dane do tablicy');
 for j := 1 to x  do
 for k := 1 to y  do
 read(a[j,k]);

if x >= y then
   begin
   for k := 1 to y do
   for j := 1 to y do
   w[i] := w[i] + a[j,k];
   end
else
   begin
   for j := 1 to x do
   for k := 1 to x do
    w[i] := w[i] + a[j,k];
   end;
No i jak tutaj wpisać to że te wyniki mają być zawarte w tablicy każdy na innym miejscu?
Bardzo prosze o pomoc
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Przesunięcie sumy kwadratu tablicy

Post autor: spajder »

oznaczamy jako a mniejszy z boków prostokąta (tj. tablicy dwuwymiarowej). Wtedy kwadrat ma rozmiar a na a. Takich kwadratów będzie b-a + 1, gdzie b jest większą z tych liczb (czyli jest tak jak napisałeś), tylko to wszystko co masz musisz wykonać b-a+1 razy (w pętli for). Tworzysz nową tablicę wyniki i w każdej iteracji przypisujesz sumę do komórki wyniki, potem wybierasz największy element tej tablicy

ogólnie:

Kod: Zaznacz cały

for k := 1 to  x-y+1 do
begin
    suma := 0;
    for i:= k to k + y do
        for j := 1 to y do
            suma := suma + w[i][j];
    wyniki[k] := suma;
end;
to jest wersja dla \(\displaystyle{ x>y}\), tj. bierzesz kwadrat w samym rogu, potem kwadrat przesunięty o 1 w prawo, potem o jeszcze 1 w prawo itd. dla, każdego liczysz sumę. Potem tylko trzeba z tych sum wybrać największą.
Tak samo robisz dla \(\displaystyle{ y>y}\) i pozostaje najprostszy przypadek dla \(\displaystyle{ x=y}\)
ODPOWIEDZ