bestimme Elemente in Array in const umwandeln
-
Hey,
ich bin noch C++ Anfänger und habe mir als Ziel gesetzt, einen Sudoku Solver zu programmieren.
Nun bin ich auf ein Problem gestoßen, und zwar hab ich in dem Programm ein festes 2D Array vorgegeben, in dem das Anfangs Sudoku drinnen steht, die leeren Felder sind dabei Nullen.
Mein Problem ist nun, dass ich nicht weiß, wie ich die vorgegebenen Zahlen als unveränderbare Konstanten festlege und die Nullen sollen eben veränderbar sein.Vielleicht kann mir da jemand weiterhelfen
-
Alle Elemente eines Arrays sind vom selben Typ. Was Du willst geht also nicht.
Was Du machen könntest ist das Array in einer Klasse kapseln und in den Methoden für schreibenden Zugriff eine Kontrolle durchführen. Ob das sinnvoll ist ist die andere Frage.
-
ok schade, fällt dir irgendein anderer Weg, wie man es machen kann?
-
Welches Problem willst Du denn mit der Idee einzelne Array-Elemente
const
zu machen lösen?
-
@mute7 sagte in bestimme Elemente in Array in const umwandeln:
ok schade, fällt dir irgendein anderer Weg, wie man es machen kann?
Was soll es genau sein? Vermutlich soll doch das Programm zur Laufzeit prüfen, ob ein Wert vorgegeben (d.h. nicht änderbar ist). Das hat aber nichts mit dem C++ Konstrukt const zu tun.
-
Ich möchte Sudokus automatisch lösen lassen mit Backtracking von Reihe zu Reihe.
Da aber einige Zahlen schon in dem Sudoku selbst stehen, und die auch nicht mehr verändern werden, muss ich die von dem Backtracking ja irgendwie ausschließen.
-
@mute7 sagte in bestimme Elemente in Array in const umwandeln:
muss ich die von dem Backtracking ja irgendwie ausschließen.
Einfach die, wo ein Wert ungleich 0 drin steht?
-
@Belli Ja aber backtraking geht ja quasi immerweiter von links nach rechts und wieder zurück, auf dem Rückweg ständen da ja dann keine Nullen mehr drin.
-
- vorgegebene Zahlen als negative Zahlen eintragen
- ein zweites Array mit bool verwenden
- im Array bool und int statt nur int speichern
- unodered_set<pair<int,int>> mit den Koordinaten der vorgegebenen Zahlen
-
@mute7
Nö, wenn Du sagst, probiere alle Werte von 1 bis 9 aus, wenn eine 0 drinsteht, ansonsten überspringe dieses Feld, dann ist das ne ganz normale Schleife, die auf dem 'Rückweg' das auf dem 'Hinweg' übersprungene Feld auch nicht anpackt.
-
Wenn keine Lösung möglich ist, setzt man die Felder jeweils wieder zurück.
Vielleicht wird das hier etwas deutlicher (erste Spalte und erste Reihe sind gesetzt):
https://i.ibb.co/TMfJ021/Sudoku.webp
Es ist natürlich noch immer keine gute Lösung, aber keine Ahnung, wie momentan der Stand der Dinge ist.
-
Dazu braucht es keine anderen Datentypen:
if (sudoku[x, y] == 0) { sudoku[x, y] = new_value; do_backtracking(); sudoku[x, y] = 0; }