Wie Einträge in mehrdimensionalem Array "dynamisch/variabel" vergleichen?
-
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); } }; // algorithmz.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; }