[C++]Szukanie "komnat" w macierzy

0

Witam. Mam problem związany z szukaniem komnat w macierzy czyli takich bloków złożonych z zer , gdy tablica jest wypełniona 1 i 0. Czy taki pomysł jest ogólnie dobry?

  1. Przy kompilacji mam coś takiego :
    [quote]|28|error: cannot convert int (*)[20]' to int**' for argument 1' to void wyszukaj(int**, int, int)'|[/quote]
    Mam taki kod:

[code]#include <iostream>

using namespace std;

int komnata=0;

void wyszukaj(int *t[20],int i, int j)
{
if(t[i][j] == 0){
t[i][j]=1;
wyszukaj(t,i+1,j);
wyszukaj(t,i-1,j);
wyszukaj(t,i,j+1);
wyszukaj(t,i,j-1);
komnata++;
}
}

int main()
{
int t[20][20];
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
t[i][j] = rand()%1;

for(int i=0;i<20;i++)
    for(int k=0;k<20;k++)
        wyszukaj(t,i,k);
return 0;

}
[/code]

1

NIE

0

Za takie odpowiedzi to powinni wieszać...

1

Podobnie jak za pytania tej jakości.
Gdzie jest definicja "komnaty"? przykładowo w obliczaniach na macierzach może chodzić o prostokątny obszar wypełniony zerami. W grach morze chodzić o spójny obszar o dowolnym kształcie.

Co do samego kodu to właściwie nic on nie robi. Wypełnia wszystko 1 i koniec, a chyba chodzi, że ma się pojawić jakiś wynik.
Doprecyzuj pytanie, wtedy dostaniesz pomoc.
Co do błędu to źle maasz zdefiniowny argument funkcji, powinno być void wyszukaj(int t[][20],int i, int j), albovoid wyszukaj(int (*t)[20],int i, int j) .

0

Chodzi mi ze mam macierz t[N][N] w tym przypadku 10x10 (zmniejszyłem). Wypełniam go zerami i jedynkami. Muszę szukać takich bloków złożonych z samych zer, policzyć ile jest autonomicznych takich obszarów.
Poprawione EDIT:

[code]#include <iostream>

using namespace std;

int komnata=0;

void wyszukaj(int (*t)[10],int i, int j)
{
if(t[i][j] == 0){
t[i][j]=2;
wyszukaj(t,i+1,j);
wyszukaj(t,i-1,j);
wyszukaj(t,i,j+1);
wyszukaj(t,i,j-1);
komnata++;
}
}

int main()
{
int t[10][10];
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
t[i][j] = rand()%2;

for(int i=0;i<10;i++)
{
    for(int j=0;j<10;j++)
        cout << t[i][j] << " ";
    cout << endl;
}



for(int i=0;i<10;i++)
    for(int k=0;k<10;k++)
        wyszukaj(t,i,k);

cout << endl;
cout << endl;
for(int i=0;i<10;i++)
{
    for(int j=0;j<10;j++)
        cout << t[i][j] << " ";
    cout << endl;
}

cout << komnata;
return 0;

}

[/code]

1
1111111
1000011
1000011
1110111
1100001
1100001
1111111

Ile jest autonomicznych obszarów?
Czy to są dwa bloki 4x2 czy może jeden 1x5 ?

0

W tym wypadku 1 , bo zera są połączone, nie powinno tylko działać na skos.

Żeby to jakoś ładniej wytłumaczyć , zespół zer położonych obok siebie to pokój , 1 to ściana. Ile jest takich pokoi.

0

Najprościej będzie użyć nieco zmodyfikowanego flood-fill.

0

Patryk27 - bardziej chodzi mi w ten sposób. Mam takie coś na zaliczenie algorytmów. Ten program sam próbuję w c++ żeby ogarnąć zasadę działania

To ja już kompletnie nie wiem jak się za to zabrać. Wiem ,że potrzebuję jakiegoś warunku tylko nie wiem jakiego. Który zastopuje sprawdzanie i doda komnata++;

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