Zadanie z algorytmów C++

0

Dzień dobry

Mam problem z poniższym zadaniem. Po wrzuceniu rozwiązania do sprawdzarki "themis" otrzymuje 1 na 3 sprawdzenia pozytywne. Próby nie zaliczone wyrzucają komunikat "wrong answer". Poniżej treść zadania i mój kod.

Treść zadania:

Stokrotki
Problem code: STO1 | Limits: 2 s, 32 MB
Dana jest tablica o rozmiarach n x m. Elementami tej tablicy są liczby całkowite. Drogą przez tablicę nazywamy m-elementowy ciąg liczb a0,a1,…,am-1 ze zbioru {0,1,2,...,n-1}, taki, że ai-1 - 1 ≤ ai ≤ ai-1 + 1 dla każdego i > 0. Oznacza ona ciąg pól tablicy o współrzędnych (ai, i). Jak łatwo zauważyć, droga :

zaczyna się w pierwszej kolumnie (w dowolnym wierszu),
w kolejnych krokach przechodzi przez kolejne kolumny dla i=0,…,m-1, a numer wiersza w każdym kroku może zmienić się nie więcej niż o jeden,
kończy się w ostatniej kolumnie (w dowolnym wierszu).
Kosztem drogi nazywamy sumę liczb znajdujących się na polach, przez które ona przechodzi.

Wejście
W pierwszym wierszu podana jest liczba naturalna c określająca liczbę zestawów danych. Każdy zestaw zapisany jest w dwóch wierszach. W pierwszym z nich znajdują się dwie liczby n, m – wymiary tablicy (odpowiednio: liczba wierszy i liczba kolumn), oba nie większe od 1000; w drugim – m*n elementów tablicy (pierwszych m liczb to elementy pierwszego wiersza czytane od lewej do prawej, kolejnych m liczb to elementy drugiego wiersza, itd.).

Wyjście
Należy wypisać c wierszy. W i-tym wierszu ma znaleźć się jedna liczba określająca, koszt najtańszej drogi w i-tej tablicy.

Przykład
Dla danych wejściowych
1
2 3
43 76 30 55 66 55
poprawną odpowiedzią jest
139

Uwaga:
Dane w przykładzie odpowiadają tablicy:
43 76 30
55 66 55
Najtańsza droga prowadzi przez pola zawierające liczby: 43, 66, 30.

Mój kod:

#include <iostream>
using namespace std;

int smaller(int a, int b){
  int small = a;
  if(b < a){
    small = b; 
  }
  return small;
}

int main(){
  int x;
  cin>>x;
  int y, z;
  int*** array = new int**[x];
  int *ySize = new int[x];
  int *zSize = new int[x];
 
  for (int i = 0; i < x; i++){
    cin>>y>>z;
    array[i] = new int*[y];
    ySize[i] = y;
    zSize[i] = z;
    for (int j = 0; j < y; j++){
      array[i][j] = new int[z];
    }
    for (int j = 0; j < y; j++){
      for (int k = 0; k < z; k++){
        int number = 0;
        cin>>number;
        array[i][j][k] = number;
      }         
    }  
  }
  for (int i = 0; i < x; i++){
    for (int j = 0; j < ySize[i]-1; j++){
      int result = 0; 
      for (int k = 0; k < zSize[i]; k++){
        result += smaller(array[i][j+1][k], array[i][j][k]);
      }
      cout<<result<<endl;
    }
    if(y <= 1 || z <= 1){
      int result = 0; 
      for (int j = 0; j < ySize[i]; j++){
        for (int k = 0; k < zSize[i]; k++){
          result += array[i][j][k];
        }
      }
      cout<<result<<endl;
    }
  }
  for (int i = 0; i < x; i++){
    for (int j = 0; j < ySize[i]; j++){
      delete[] array[i][j];
    }
    delete[] array[i];
  }
  delete[] array;
  return 0;
}
4

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
Masz wyciek pamięci https://godbolt.org/z/99nhKb (nie analizowałem twojego kodu).
Za dużo masz napisane wewnątrz main. Dziel kod na mniejsze problemy w osobnych funkcjach.

Może lepiej jak zaczniesz od czegoś takiego: https://godbolt.org/z/q1383W

1

Kosztem drogi nazywamy sumę liczb znajdujących się na polach, przez które ona przechodzi.

Stąd też koszt drogi, w kodzie zmienna result, powinna być typu size_t, gdyż możliwa jest sytuacja wyjścia poza zakres int w procesie dodawania.

1

Fragment kodu, który mar rozwiązywać zadanie:

    for (int j = 0; j < ySize[i]-1; j++){
      int result = 0; 
      for (int k = 0; k < zSize[i]; k++){
        result += smaller(array[i][j+1][k], array[i][j][k]);
      }
      cout<<result<<endl;
    }
    if(y <= 1 || z <= 1){
      int result = 0; 
      for (int j = 0; j < ySize[i]; j++){
        for (int k = 0; k < zSize[i]; k++){
          result += array[i][j][k];
        }
      }
      cout<<result<<endl;
    }

Wygląda źle. Pewnie działa tylko dla n = 2.
Nawet nie jestem w stanie zrozumieć jaki miałeś pomysł na rozwiązanie. W każdym razie wygląda na to, że uwzględniasz jedynie, ten sam poziom i krok w dół, a ignorujesz możliwość kroku w górę.
Na dodatek te dwa wystapienia cout<<result<<endl;, które mogą prowadzić do podwójnego wypisania wyniku (warunek (y <= 1 || z <= 1) jest totalnie niezrozumiały).

0

Racja teraz widzę te błędy. Zastosowałem fragmenty od @MarekR22 poszło. Dziekuje za pomoc.

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