Znajdowanie wierzchołka.

0

Witam.
Muszę wykonać takie zadanie:
screenshot-20200508175536.png
screenshot-20200508175544.png
Potrzebuję sporej pomocy, bo niestety nie za bardzo wiem jak to zacząć.

0

Zacznij od zrobienia macierzy w c, i pokaż kod.

0
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]
0
MrLester napisał(a):
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]

Sorry, widziałem u góry strony C, pomyślałem że to język :D No dobrze.

Ustaw teraz pozycję startową. Możesz zrobić dwie liczby, np x i y, albo tuple, czyli dwie zmienne w jednej, np pozycja = (10, 2). Dodaj do kodu i pokaż. Oczywiście pozycja musi być w ramach macierzy (tzn macierz 5x5 nie może mieć pozycji 6x7).

0
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]

Sorry, widziałem u góry strony C, pomyślałem że to język :D No dobrze.

Ustaw teraz pozycję startową. Możesz zrobić dwie liczby, np x i y, albo tuple, czyli dwie zmienne w jednej, np pozycja = (10, 2). Dodaj do kodu i pokaż. Oczywiście pozycja musi być w ramach macierzy (tzn macierz 5x5 nie może mieć pozycji 6x7).

Może za dużo myślę ale chyba nie jestem pewny jak ustawić tą pozycję. No bo jak chciałbym start = (0,0) to daje t[start] ?

t = numpy.array([[1,   2,  3,  4],
     [14, 15, 16,  5],
     [13, 18, 17,  6],
     [12,  9,  3,  7],
     [11, 10,  9,  8]])

start=(0,0)

print(t[start])
0
MrLester napisał(a):
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]

Sorry, widziałem u góry strony C, pomyślałem że to język :D No dobrze.

Ustaw teraz pozycję startową. Możesz zrobić dwie liczby, np x i y, albo tuple, czyli dwie zmienne w jednej, np pozycja = (10, 2). Dodaj do kodu i pokaż. Oczywiście pozycja musi być w ramach macierzy (tzn macierz 5x5 nie może mieć pozycji 6x7).

Może za dużo myślę ale chyba nie jestem pewny jak ustawić tą pozycję. No bo jak chciałbym start = (0,0) to daje t[start] ?

t = numpy.array([[1,   2,  3,  4],
     [14, 15, 16,  5],
     [13, 18, 17,  6],
     [12,  9,  3,  7],
     [11, 10,  9,  8]])

start=(0,0)

print(t[start])

No nie, tak nie zadziała. Do tego celu musisz użyć dwóch zmiennych. Zaproponowałem tuple bo w przykładzie w metodzie miałeś tuple.

0
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]

Sorry, widziałem u góry strony C, pomyślałem że to język :D No dobrze.

Ustaw teraz pozycję startową. Możesz zrobić dwie liczby, np x i y, albo tuple, czyli dwie zmienne w jednej, np pozycja = (10, 2). Dodaj do kodu i pokaż. Oczywiście pozycja musi być w ramach macierzy (tzn macierz 5x5 nie może mieć pozycji 6x7).

Może za dużo myślę ale chyba nie jestem pewny jak ustawić tą pozycję. No bo jak chciałbym start = (0,0) to daje t[start] ?

t = numpy.array([[1,   2,  3,  4],
     [14, 15, 16,  5],
     [13, 18, 17,  6],
     [12,  9,  3,  7],
     [11, 10,  9,  8]])

start=(0,0)

print(t[start])

No nie, tak nie zadziała. Do tego celu musisz użyć dwóch zmiennych. Zaproponowałem tuple bo w przykładzie w metodzie miałeś tuple.

Chyba zgłupiałem i nie wiem jak to napisać.

0

A kiedy ten program ma się zatrzymać?

0
lion137 napisał(a):

A kiedy ten program ma się zatrzymać?

Gdy znajdzie wierzchołek tzn. gdy w każdym kierunku nie będzie już najwyższych elementów i gdy wszystkie elementy dookoła będą niższe.

0
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):
MrLester napisał(a):
TomRiddle napisał(a):

Zacznij od zrobienia macierzy w c, i pokaż kod.

W C?
W Pythonie to rozumiem, że chodzi po prostu o coś takiego:

t  =  [ [7, 8, 9, 8, 7], 
       [6, 11, 10, 3, 4], 
       [5, 12, 3, 4, 5], 
       [4, 2, 3, 6, 7] ]

Sorry, widziałem u góry strony C, pomyślałem że to język :D No dobrze.

Ustaw teraz pozycję startową. Możesz zrobić dwie liczby, np x i y, albo tuple, czyli dwie zmienne w jednej, np pozycja = (10, 2). Dodaj do kodu i pokaż. Oczywiście pozycja musi być w ramach macierzy (tzn macierz 5x5 nie może mieć pozycji 6x7).

Może za dużo myślę ale chyba nie jestem pewny jak ustawić tą pozycję. No bo jak chciałbym start = (0,0) to daje t[start] ?

t = numpy.array([[1,   2,  3,  4],
     [14, 15, 16,  5],
     [13, 18, 17,  6],
     [12,  9,  3,  7],
     [11, 10,  9,  8]])

start=(0,0)

print(t[start])

No nie, tak nie zadziała. Do tego celu musisz użyć dwóch zmiennych. Zaproponowałem tuple bo w przykładzie w metodzie miałeś tuple.

No tak się składa, że dla tablic numpy to zadziała.

0

A jak zachowa się ten program dla takiej macierzy jak zaczniesz od punktu (0,0) czy dojdzie do największego wierzchołka 9 w lewym dolnym rogu?

[1 2 3 4 5 6 0 ]
[1 2 1 1 7 1 0 ]
[1 2 1 8 0 0 0 ]
[1 2 6 0 0 0 0 ]
[1 2 5 0 0 0 0 ]
[1 2 5 0 0 0 9 ]
0

Mam w tym zadaniu kilka podpunktów i robię teraz inną metodą to wyliczanie wierzchołka, mam taki kod:

class Peak(object):
    """find peak 2d"""
    
    def __init__(self, L):
        self._L = L[:]
        self._n = len(self._L)
        self._m = len(self._L[0])

    def get_dim(self):
        """zwraca rozmiary tablicy"""
        return (self._n, self._m)

    def get_val(self, loc):
        """zwraca wartosc na pozycji loc"""
        return self._L[loc[0]][loc[1]]

    def next_element(self, loc):
        """zwraca lokalizacje kolejnego elem"""
        if loc[1] < self._m - 1:
            return loc[0], loc[1] + 1
        else:
            if loc[0] < self._n - 1:
                return loc[0] + 1, 0
            else:
                return -1
        

    def divide_and_conquer(self):
    
        j = self._m//2

        x = [i[j] for i in self._L]

        i = x.index(max(x))

        print(i, j)

        if j > 0 and self._L[i][j] < self._L[i][j-1]:
            return self.divide_and_conquer([x[:j] for x in self._L])

        elif j < self._m - 1 and self._L[i][j] < self._L[i][j+1]:
            return self.divide_and_conquer([x[j:] for x in self._L])

        else:
            return self._L[i][j]
        

I problem jest taki, że dostaję błąd: TypeError: divide_and_conquer() takes 1 positional argument but 2 were given. Co jest nie tak?

1
self.divide_and_conquer([x[:j] for x in self._L])

Twoje divide_and_conquer() nie przyjmuje żadnych argumentów.

0

Jak wyżej, to: def divide_and_conquer(self) znaczy, że divide_and_concuer nie przyjmuje argumentów (self jest zawsze przekazywane, w innych językach się tego nie pisze), a w rekurencyjnym wywołaniu, jako argument dostaje listę.

0
lion137 napisał(a):

Jak wyżej, to: def divide_and_conquer(self) znaczy, że divide_and_concuer nie przyjmuje argumentów (self jest zawsze przekazywane, w innych językach się tego nie pisze), a w rekurencyjnym wywołaniu Przekazujesz mu listę.

Da się to jakoś szybko naprawić?

0

tak, Daj funkcji parametr formalny: def divide_and_conquer(self, xs)

0
lion137 napisał(a):

tak, Daj funkcji parametr formalny: def divide_and_conquer(self, xs)

I jak to potem wywołać? Bo normalnie bym to tak zrobił:

A = [[7, 8, 9, 8, 7], 
     [6, 11, 10, 3, 4], 
     [5, 12, 3, 4, 5],     
     [4, 2, 3, 6, 7]]

p = Peak(A)

print(p.divide_and_conquer())

Ale teraz to nie działa.

0

@MrLester:

def divide_and_conquer(self):  # nie przekazujesz jej tej listy 

       j = self._m//2

       x = [i[j] for i in self._L]

       i = x.index(max(x))

       print(i, j)

       if j > 0 and self._L[i][j] < self._L[i][j-1]:
           return self.divide_and_conquer([x[:j] for x in self._L])    # Metoda przyjmuje liste

       elif j < self._m - 1 and self._L[i][j] < self._L[i][j+1]:
           return self.divide_and_conquer([x[j:] for x in self._L])

       else:
           return self._L[i][j]
0

nie siedzę w Twoje głowie i nie wiem jak ten algorytm działa; Dajesz sygnaturę funkcji bez parametrów, a w środku ją Wołasz od jakiejś listy, to może punktem startowym jest pusta lista?
print(p.divide_and_conquer([]))

0

No ja wiem, że pewnie nie wiem co robię po prostu napisałem algorytm na sztywno:

def divide_and_conquer(T):

    n = len(T)
    m = len(T[0])

    j = m//2

    x = [i[j] for i in T]

    i = x.index(max(x))

    print(i, j)

    if j > 0 and T[i][j] < T[i][j-1]:
        return divide_and_conquer([x[:j] for x in T])

    elif j < m - 1 and T[i][j] < array[i][j+1]:
        return divide_and_conquer([x[j:] for x in T])

    else:
        return T[i][j]

A = [[1,   2,  3,  4],
     [14, 15, 16,  5],
     [13, 18, 17,  6],
     [12,  9,  3,  7],
     [11, 10,  9,  8]]

print(divide_and_conquer(A))

I tak działał, więc chciałem użyć do niego klas, z którymi prawie nie miałem większej styczności a dzisiaj muszę mieć no i przestało działać.

0

A od czego go Wołałeś w tej wersji bez klas?

0
lion137 napisał(a):

A od czego go Wołałeś w tej wersji bez klas?

No w tym wypadku od listy no i rozumiem, dlaczego w wersji z klasami to nie działa teraz, ale chciałbym wiedzieć co zrobić żeby zadziałało

0

No w tym wypadku od listy no i rozumiem, dlaczego w wersji z klasami to nie działa teraz, ale chciałbym wiedzieć co zrobić żeby zadziałało

Od jakiej listy?

0
javafxdev napisał(a):

A jak zachowa się ten program dla takiej macierzy jak zaczniesz od punktu (0,0) czy dojdzie do największego wierzchołka 9 w lewym dolnym rogu?

[1 2 3 4 5 6 0 ]
[1 2 1 1 7 1 0 ]
[1 2 1 8 0 0 0 ]
[1 2 6 0 0 0 0 ]
[1 2 5 0 0 0 0 ]
[1 2 5 0 0 0 9 ]

Treść pierwszego paragrafu wskazywała by na to, że kolejność byłaby taka: 1🠖 2🠖 3🠖 4🠖 5🠖 6🠗 1🠔 7

warunek > nie pozwala na np. znalezienie 9 w takim ciągu 0,0,0,0,9 zaczynając od lewej strony

0
lion137 napisał(a):

No w tym wypadku od listy no i rozumiem, dlaczego w wersji z klasami to nie działa teraz, ale chciałbym wiedzieć co zrobić żeby zadziałało

Od jakiej listy?

No od listy A

0
MrLester napisał(a):
lion137 napisał(a):

No w tym wypadku od listy no i rozumiem, dlaczego w wersji z klasami to nie działa teraz, ale chciałbym wiedzieć co zrobić żeby zadziałało

Od jakiej listy?

No od listy A

To to samo zrób w wersji z klasą

0
lion137 napisał(a):
MrLester napisał(a):
lion137 napisał(a):

No w tym wypadku od listy no i rozumiem, dlaczego w wersji z klasami to nie działa teraz, ale chciałbym wiedzieć co zrobić żeby zadziałało

Od jakiej listy?

No od listy A

To to samo zrób w wersji z klasą

RecursionError: maximum recursion depth exceeded in comparison Chyba jestem na to za głupi.

0
MrLester napisał(a):

RecursionError: maximum recursion depth exceeded in comparison Chyba jestem na to za głupi.

stos ci się przepełnił, zwiększ limit albo rekurencje zamień na iteracje

import sys
print(sys.getrecursionlimit()
sys.setrecursionlimit(...)
0
jvoytech napisał(a):
MrLester napisał(a):

RecursionError: maximum recursion depth exceeded in comparison Chyba jestem na to za głupi.

stos ci się przepełnił, zwiększ limit albo rekurencje zamień na iteracje

import sys
print(sys.getrecursionlimit()
sys.setrecursionlimit(...)

Dziekuję, pomogło, ale teraz pokazuje inny wynik niż bez użycia klas, więc nie wiem co teraz jest nie tak.

0

Głupio, ale działa https://repl.it/repls/ThinSourRobot. Zastanów się jak to można przerobić

1 użytkowników online, w tym zalogowanych: 0, gości: 1