PROBLEM Bezpieczni alpiniści - praca domowa domowa w c++

0

Mam do zrobienia pracę domową i siedzę nad nią od 4 godzin. Nie wiem co mam dalej zrobić. Program się kompiluje poprawnie ale wypluwa nie te dane co powinien. On nie jest dokończony bo nie jestem w stanie przebrnąć przez ten problem. Jestem dopiero początkujący w c++. Czy ktoś byłby w stanie mi pomóc?

Bezpieczni Alpiniści

Grupa alpinistów wspina się na szczyt podążając wąskim szlakiem. Taternicy idą jeden za drugim, ostrożnie, bo ́scieżka jest stroma i niebezpieczna. Część ze wspinaczy posiada zabezpieczenie w postaci liny, a pozostali niestety go nie mają. Wyposażenie grupy alpinistów można opisać przy pomocy cągu liter:
•B oznacza bezpiecznego alpinistę (wyposa ̇zonego w linę);
•Z oznacza zagrożonego alpinistę (bez liny).

Przykładowo, ciąg znaków BZZBZ oznacza grupę pięciu alpinistów, z których dwóch posiada liny. Na czele grupy znajduje się alpinista pierwszy z prawej (w tym przypadku bez liny). Kolegów jednak nie zostawia się bez pomocy w potrzebie. Alpinista z liną może podać linę koledze idącemu bezpośrednio przed nim (i wtedy obaj są bezpieczni), przy czym taki gest jest wykonywany naraz przez wszystkich alpinistów, którzy mogą go wykonać. Zatem w tym przypadku ciąg znaków ulegnie następującej zmianie:

BZZBZ−→BBZBB

Kolorem czerwonym oznaczono alpinistów, którzy stali się bezpieczni. Takie koleżeńskie gesty są powtarzane, dopóki są możliwe:

BBZBB−→BBBBB

W tym momencie wszyscy alpiniści są już bezpieczni – po dwóch gestach koleżeńskich.Oczywiście, nie dla każdej grupy alpinistów zapewnienie bezpieczeństwa wszystkim będzie możliwe. Alpinista, który idzie na początku grupy, nie może użyczyć swojej liny koledze, ponieważ przed nim nikt nie idzie.

Napisz program, który dla danej grupy alpinistów oblicza ilość potrzebnych gestów, aby wszyscy stali się bezpieczni, lub wyrokuje, że jest to niemożliwe.

Wejście

Pierwszy wiersz standardowego wejścia zawiera dodatnią liczbę całkowitą oznaczającą ilość zestawów danych czyli grup alpinistów (N≤200).

Każdy kolejny z wierszy zawiera ciąg liter B lub Z opisujących wyposażenie alpinistów w danej grupie (zgodnie z treścią zadania). Każda grupa liczy od 1 do 1 000 000 osób, przy czym można założyć, ̇ze łączna liczność wszystkich grup nie przekroczy 20 000 000.

Wyjście

Program powinien dla każdej grupy wypisać wiersz tekstu zawierający ilość potrzebnych gestów, które doprowadzą do sytuacji, kiedy wszyscy alpiniści w grupie staną się bezpieczni, lub liczbę −1, jeśli jest to niemożliwe.

Przykład

Dla przykładowego, podanego poniżej wejścia:
3
BZZBBZ
BZZZ
ZBBB

poprawnym wynikiem jest:
2
3
-1

Wyjaśnienie do przykładu: Pierwszy przypadek opisany jest w treści zadania. W drugim przypadku podawanie liny przebiega tak:

BZZZ−→BBZZ−→BBBZ−→BBBB

W trzecim przypadku ostatni alpinista nie może otrzymać liny.


#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int N, przejscia;
string a,b,c;
main()
{
N=3;
cout << N<<endl;

 

a="BZZBB\n";
char a1=(a[1]);
b="ZBBZBZBB\n";
c="BBZZZZBZBZBZ\n";
int ailosc = a.length();
int bilosc = b.length();
int cilosc = c.length();

 

cout <<a;
cout <<b;
cout <<c;



if (a[0]=='Z')
{cout << "-1";
}
if (b[0]=='Z')
{cout << "-1";
}
if (c[0]=='Z')
{cout << "-1";
}
int h, k;
h=0;
k=0;
if (a[0]=='B')
{for (int i=1; i<=ailosc; i++)
{h=h++;
if ((a[h]=='Z')and(a[k]=='B'))
{a[h]='B';
przejscia=0; 
przejscia=przejscia++;
}
k=k++;
}
}
cout << przejscia;

 

}




3

Przede wszystkim:

  • formatuj kod, tego nie da się czytać. Jak nie umiesz to http://format.krzaq.cc
  • wyrzuć kod sprawdzający do osobnej funkcji, a nie sprawdzaj zahardkodowane dane testowe

Podejrzewam, że po wykonaniu punktu 2 problem uprości się na tyle, że od razu zobaczysz co jest nie tak.

3

Takie podstawienie

k=k++;

nie zmieni wartości k. Równie dobrze możesz napisać

k=k;
2
Janusz Nowakowski napisał(a):

Pierwszy wiersz standardowego wejścia zawiera dodatnią liczbę całkowitą oznaczającą ilość zestawów danych czyli grup alpinistów (N≤200).

ta treść zadania wskazuje, że kodowanie na sztywno danych nie jest poprawną implementacją

Dla przykładowego, podanego poniżej wejścia:
3
BZZBBZ
BZZZ
ZBBB

zapisz te 4 linijki do pliku tekstowego np. testy.txt i wywołaj w ten prosty sposób:

alpinisci.exe < testy.txt

przy większej ilości danych wejściowych możesz w jednym pliku trzymać wyniki poprawnych testów, żeby porównać to co twój program oblicza (wymagany diff) np:

$ alpinisci < testy.txt  |  diff -y testy_wyniki_poprawne.txt -
2                                                             | -1
3                                                             | -1
-1                                                              -1

powyższe jest wynikiem tego przykładowego programu:

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

int oblicz_przejscia(string& grupa) {
    // do zaimplementowania
    return -1;
}

int main() {
    int ile_grup;
    cin >> ile_grup;

    for (int i = 0; i < ile_grup; ++i) {
        string grupa;
        cin >> grupa;
        cout << oblicz_przejscia(grupa) << endl;
    }

    return 0;
}

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