Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Rechtecke erstellen von ein Array...

Guten Tag,

Brauche eine Idee für ein Algorithmuss vielleicht kann mir ja jemand hier weiterhelfen....

Wenn ich ein Array der größe NxN habe ... und von den Array einfach paar rechtecke rauswählen ( die nicht der größe NxN sind)

will wie mache ich das am geschicktesten ?

danke im voraus....

LG


Antworten zu Rechtecke erstellen von ein Array...:

Hmm, also sowas wie

int xAnfang=..., yAnfang=..., xEnde=..., yEnde=...;
for( int i = yAnfang; i <= yEnde; ++i ){
    for( int j = xAnfang; j <= xEnde; ++j ){
        // do something with array[i][j]...
    }
}
???
Keine Ahnung, da fällt mir jetzt auch nix ein

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
und von den Array einfach paar rechtecke rauswählen

Wie jetzt "paar Rechtecke"? Per Zufall? Die Randomizer vieler Sprachen lassen sich mit unterer und oberer Grenze aufrufen, das wäre dann hier 0 bzw. 1 bis Arraylänge.

Um alles zu durchlaufen, wäre Lisaas Variante geeignet.

Wenn das deine Frage nicht noch beantwortet, dann lag's wohl an der Fragestellung ;D

greez 8)
JoSsiF

Kann man nicht einfach nen <datatype>** erstellen und den direkt ins Array reinzeigen lassen? Müsste man bloß mit den Arraygrenzen aufpassen...

Ich seh grad, das war wohl keine gute Idee. Kann man nicht einfach mit offsets rechnen? Sowas wie
array[y+yAnfang][x+xAnfang]
Und was hast du damit überhaupt vor?

mhhh ja das die summe den gegebenen wert ergibt !

z.B

2 2 3 4 5 9 6
2 3 5 4 9 7 6    x=6
1 4 6 8 9 2 1
4 2 3 5 4 8 9
1 2 3 4 6 9 7

und jetzt versuche ich in dieser matrize rechtecke zu finden deren summe die zahl x ergibt !!!!!

Achso, jetzt versteh ich. Nee, da fällt mir auch nix elegantes ein. Ich würds stumpf "zu Fuß" machen...

ja will es ja per numerik machen nur das problem ist ja ich wüsste nicht wie ich solche rechtecke erzeuge in mein array ! das ausrechnen und filtern ist ja kein problem aber das erzeugen.....mg

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Die Erzeugung der Matrix ist das Problem? Einfach in einer Schleife ein Array füllen mit Zufallswerten in gegebenen Grenzen, nicht? :o

nicht die Matrix :) sondern die kleinen rechtecke in der MATRIX !!!!!!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hmm, also was richtig elegantes fällt mir dazu nicht ein. Probier doch erstmal so:
1. Nimm das erste Feld (1,1). Rechteck gefunden! Größe 1x1
2. Nimm das darunter liegende Feld dazu (1,2) Rechteck gefunden, Größe 1x2
3. Nimm immer das darunterliegende Feld dazu bis das Array zuende ist (1,3), (1,4) usw. Jeder Schritt ergibt ein Rechteck.
4. Nimm wieder das erste Feld
5. Nimm das rechts daneben dazu
6. Nimm die Felder eins unter den selektierten Feldern dazu
7. Widerhole 6. bis das Array unten zuende ist.
8. Wiederhole 5-7 bis das Array rechts und unten zuende ist.
9. Wiederhole 2-8 mit jedem Feld.

Ist recht länglich aber es gibt halt auch seeeehr viele Rechtecke selbst in einer recht kleinen Matrix (bei 2x2 gibt es bereits 9 Rechtecke!, bei 3x3 32) 

ich kriege das irgendwie nicht hin :( kannst du ma den anfang machen :))))))

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich probiers mal. Ein paar Anmerkungen vorweg
- Ich hab einfach mal sone Art C++ genommen
- Programm ist so sicherlicherlich nicht lauffaehig, ich hoffe aber, dass der Algorithmus an sich funktioniert
- Ich kann das gerade nicht testen, daher ohne Gewaehr  ;)

// Fuer die Ergebnisse
class CResultEntry{
private:
    int mStartingWidth; //x-Index
    int mStartingHeight; //y-Index
    int mWidth; //Breite des Eintags
    int mHeight; //Hoehe des Eintrags
public:
    CResultEntry::CResultEntry( int sw, int sh, int w, int h )
        : mStartingWidth( sw ), mStartingHeight( sh ),
          mWidth( w ), mHeight( h );
    {};
}
typedef std::vector< CResultEntry > resultVec;

class CRectangleFinder{
private:
// Vorraussetzungen
int a[][] = ...;// das Array
int sum = ...; // die gesuchte Summe
int width = ...; // die Breite des Arrays
int height = ...; // die Hoehe des Arrys
resultVec results;

public:
CRectangleFinder::CRectangleFinder(){};

void CRectangleFinder::find()
{
    // loop ueber alle Felder
    for( int i = 0; i < height; ++i )
    {
        for( int j = 0; j < width; ++j )
{
    checkHorizontal( i, j );
    checkMulti( i, j );
}
    }

}

private:
// check in x-Richtung mit Tiefe 1
void CRectangleFinder::checkHorizontal( int x, int y )
{
    int tSum = a[x][y];
    int tWidth = 0;
    for int( k = x; k < width; ++k )
    {
        tSum += a[k][y];
tWidth++;

// Ergebnis gefunden -> speichern!
if( tSum == sum ) results.push_back( new CResultEntry( x, y, tWidth, 1 ) );

// Summe zu gross, verlasse Funktion
if( tSum > sum ) return;
    }

}

// check in x-Richtung mit Tiefe n
void CRectangleFinder::checkMulti( int x, int y)
{
    // letzte Zeile erreicht, Tiefe > 1 existiert nicht
    if( y == height ) return;
   
    for( int k = x; k < width; ++k )
    {
    int tSum = a[x][y];
        int tWidth = 1 + k - x;
        int tHeight = 1;

        for( int l = y + 1; l < height; ++l )
{
    tHeight++;
    tSum = calculate( x, y, tWidth, tHeight );
   
    //Summe schon zu gross, verlasse innere for-Schleife
    if( tSum > sum ) break;
   
    // Ergebnis gefunden -> speichern!
    if( tSum == sum ) results.push_back( new CResultEntry( x, y, tWidth, tHeight ) );
}
    }

}

// Berechne Summe
int CRectangleFinder::calculate( int x, int y, int w, int h )
{
    int rval = 0;
    for( int i = x; i < x + w; ++i )
    {
        for( int j = y; j < y + h; ++j )
{
    rval =+ a[i][j];
}
    }
    return rval;

}
}

ja ok ich versuchs ma damit... aber vorweg schon ma dankeschönnnnnnnnn :)


« ProgrammierenPhysikgames »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Tag
Ein Tag ist ein englischer Begriff und bedeutet so viel wie Etikett, Mal, Marke, Auszeichner und Anhänger. Generell ist Tag eine Auszeichnung eines Datenbetandes mit...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...