Wie Einträge in mehrdimensionalem Array "dynamisch/variabel" vergleichen?



  • Hallo Community!

    Ich habe folgendes Problem. Ich bin gerade dabei ein Feld als [6][6]-Array zu verwirklichen. Am Anfang sind alle Plätze des Arrays mit dem selben Zeichen belegt. Der Nutzer kann nun die Koordinate des Punktes bestimmen, sodass dort ein anderes Zeichen gesetzt wird. Soweit so gut.
    Jetzt will ich nach dem folgenden Schema überprüfen, ob der Nutzer mit seinem Zeichen eine Kette von zum Beispiel 3 geschaffen hat. Also zum Beispiel:
    000000
    000000
    000000
    00XXX0
    000000
    000000
    Ich habe mir jetzt gedacht, ich könnte das in der Art WENN Zeichen GLEICH dem Zeichen eins weiter links UND GLEICH dem Zeichen zwei weiter links ist, DANN wurde eine Reihe geschaffen.
    ➡ Wie kann ich diese variablen Orte angeben?



  • So zum Beispiel:

    if (array[x][y]==array[x+1][y] //...
    

    Innerhalb der eckigen Klammern kannst du praktisch beliebig komplexe Ausdrücke schreiben, auch Funktionsaufrufe (solange sie den richtigen Typ liefern).



  • Naja gilt die Kette auch für 0? Soll die Kette nur waagerecht gehen?

    template<typename iterator_type, typename element_type>
    std::pair<bool, iterator_type> find_chain(iterator_type first, iterator_type last, element_type const & element, const std::size_t size)
    {
        for (iterator_type it(first); (it + size) < last; ++it)
        {
            bool chain(true);
            for (iterator_type it_chain(it); (it_chain != (it + size)) && chain == true; ++it_chain)
                chain = *it_chain == element;
    
            if (chain == true) return std::make_pair<bool, iterator_type>(true, it);
        }
        return std::make_pair<bool, iterator_type>(false, first);
    }
    

    😃 sowas geht doch 😉

    int main()
    {
        int arr_data[6][6];
        const std::pair<bool, int*> result(find_chain(arr_data[0], arr_data[0] + 6, 10, 3));
    }
    

    So würdest du dann bsw. die Zeile 0 des Array "arr_data" nach eine Folge von drei "10"-nen durchsuchen!



  • Schaut in data ob in einer der "Zeilen" "needed" mal "search" hintereinander vorkommt (sollte es zumindest):

    int data[10][10];
    int needed = 3;
    int search = 7;
    
    bool success = false;
    for(int x = 0; x < 10; ++x){
      for(int y = 0; y < 10 - needed; ++y){
        success = true;
        for(int k = 0; k < needed; ++k){
          if (data[x][y+k] != search){
             success = false;
             break;
          }
        }
        if (success) break;
      }
      if (success) break;
    }
    


  • @(D)Evil: Er ist noch bei einfach Grundstrukturen und du kommst mit sowas 😃



  • Vielen Dank erstmal für die schnelle Hilfe. Ich werde nach und nach alles ausprobieren. das mit [x+1] hatte ich so in der Art glaube ich schon mal probiert. Aber ich prob einfach nochmal alles und sag wenns nicht geht, was der Compiler genau meckert...



  • Wobei man meinen Algorithmus natürlich optimieren könnte.

    namespace algorithm
    {
    	template<typename iterator_type, typename element_type>
    	std::pair<bool, iterator_type> find_chain(iterator_type first, iterator_type last, element_type const & element, const std::size_t size)
    	{
    		for (iterator_type it(first); (it + size) < last; ++it)
    		{
    			iterator_type it_chain(it);
    			for (; (it_chain != (it + size)) && *it_chain == element; ++it_chain);
    			if ((it + size) == it_chain) return std::make_pair<bool, iterator_type>(true, it);
    			it = it_chain;
    		}
    		return std::make_pair<bool, iterator_type>(false, first);
    	}
    }; // algorithm
    

    z.B. sollte schon um einiges bessere Durchlaufzeiten haben ...



  • Ich habe mir jetzt nochmal die Methode, die mir am Einfachsten erscheint herausgesucht. Ich hatte es aber auch schon einmal so probiert. (Nicht grad verwunderlich: ) Es funktioniert nicht.

    #include <iostream>
    using namespace std;
    
    int main(void) {
    	char Feld[3][3] = {
    		{'-', '-', '-',},
    		{'-', '-', '-',},
    		{'-', '-', '-',},
    	};
    
    	for (int x = 0; x < 3; x++) {
    		for (int y = 0; y < 3; y++) {
    			cout << Feld[x][y] << ' ';
    		}
    		cout << '\n';
    	}
    
    	if (Feld[x][y] == Feld[x+1][y]) {
    		cout << "Funktioniert";
    	}
    
    	cin.get();
    	return 0;
    }
    

    Der Compiler (aktueller MinGW) sagt folgendes, aus dem ich nicht recht schlau werde:

    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP: In function `int main()':
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:18: error: name lookup of `x' changed for new ISO `for' scoping
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:11: error:   using obsolete binding at `x'
    C:\DOKUME~1\Chef\Desktop\4_GEWI~1.CPP:18: error: `y' was not declared in this scope
    


  • int x und int y sind nur innerhalb der for-Schleife gültig.
    Machs so:

    int x, y;
    for (x = 0; ... usw. usw.



  • So wie ich das sehe, würde es aber vermutlich mehr Sinn machen, die if-Abfrage in die innere Schleife zu bewegen.
    Edit: dann darf x aber nicht bis 2 gezählt werden, da 2+1 über das Array hinaus geht.



  • Vielen Dank für die bisherige schnelle Hilfe, aber:

    Irgendwie klappt das alles noch nicht ganz optimal. Wenn ich die Ausgabe in die äußere Schleife setze, bleibt die Fehlermeldung. Bei der inneren ergibt sich die folgende Ausgabe:

    - Funktioniert- Funktioniert- Funktioniert
    - Funktioniert- Funktioniert- Funktioniert
    - - -
    

    Doch das ist ganz und gar nicht was ich will. Kann ich nicht irgendwie deklarieren, dass die erste eckige Klammer die Variable x und die zweite die Variable y bekommt. Quasi so in der Art:

    char Feld[x][y]
    

    Sodass ich dieses x und y mit rechungen (z.B. x+1) überall ausführen kann.



  • Dein Programm:

    #include <iostream>
    using namespace std;
    
    int main(void) {
        char Feld[3][3] = {
            {'-', '-', '-',},
            {'-', '-', '-',},
            {'-', '-', '-',},
        };
    	int x, y;
    
    	for (x = 0; x < 3; x++) {
            for (y = 0; y < 3; y++) {
                cout << Feld[x][y] << ' ';
            }
            cout << '\n';
        }
    
        if (Feld[x][y] == Feld[x+1][y]) {
            cout << "Funktioniert";
        }
    
        cin.get();
        return 0;
    }
    


  • Vielen Dank für die Hilfe. Bei mir gabs immer ein Fehler und Windows wollte ein Problembericht senden. Dabei hatte ich es fast genau so... (Ich hab blöderweise in der for-Schleife nochmal "int x..." geschrieben. Naja...)
    Komischerweise gibt es keine Ausgabe mit "Funktioniert". Nur das Spielfeld mit

    ---
    ---
    ---
    

    Dabei müsste es doch so korrekt sein. Oder steh ich jetzt irgendwie volle Kanne auf dem Schlauch?



  • #include <iostream>
    using namespace std;
    
    int main(void) {
        char Feld[3][3] = {
           /*entspricht Feld[0][0],Feld[0][1] und Feld[0][2]*/ {'-', '-', '-',},   
           /*entspricht Feld[1][0],Feld[1][1] und Feld[1][2]*/ {'-', '-', '-',},
           /*entspricht Feld[2][0],Feld[2][1] und Feld[2][2]*/ {'-', '-', '-',},
        };
    	int x, y;
    
    	for (x = 0; x < 3; x++) {
            for (y = 0; y < 3; y++) {
                cout << Feld[x][y] << ' ';
            }
            cout << '\n';
        }
        // an dieser Stelle, nach Verlassen der Schleife, ist x = 3 und y = 3 
        // Feld[3][3]  gibts nicht - weil ausserhalb der Feldgrenzen!
    
    	x=1; y=2;  // wäre ok
    
    	if (Feld[x][y] == Feld[x+1][y]) {
            cout << "Funktioniert";
        }
    
        cin.get();
        return 0;
    }
    

    😉



  • Vielen Dank für die Antwort!
    Doch leider gibts für mich jetzt ein neues Problem: Jetzt kann ich durch diese Anweisung ja nicht mehr überprüfen, ob irgendwo in dem Array zweimal das gleiche Zeichen hintereinander kommt, sondern nur an einer (bzw. mehreren) bestimmten Stelle, oder?



  • Fellhuhn schrieb:

    Schaut in data ob in einer der "Zeilen" "needed" mal "search" hintereinander vorkommt (sollte es zumindest):

    int data[10][10];
    int needed = 3;
    int search = 7;
    
    bool success = false;
    for(int x = 0; x < 10; ++x){
      for(int y = 0; y < 10 - needed; ++y){
        success = true;
        for(int k = 0; k < needed; ++k){
          if (data[x][y+k] != search){
             success = false;
             break;
          }
        }
        if (success) break;
      }
      if (success) break;
    }
    

Anmelden zum Antworten