Also habe ich Rätsel mit folgendem Format:Warum wird die Quellstruktur entsprechend der Kopie geändert?
1 2 3
4 x 5
6 7 8
In dieser Funktion I ‚x‘ bewegen, 4 möglichen Variationen zu erzeugen, von denen jeder mit ‚x‘ Währungspositionen mit einem seiner Nachbarn.
Das Problem ist: Jedes Mal, wenn ich eine der Kopien modifiziere, wird auch die ursprüngliche Struktur geändert, so dass die nächsten Variationen die vorherigen xs akkumulieren. Am Ende der Funktion current
ist:
1 x 3
x 7 x
6 x 8
(die erste Änderung tatsächlich richtig ist, das ist, warum die mittlere 'x' verschwindet)
Mein Code:
struct state{
char** puzzle;
// (...)
bool valid;
int xi; // x's row
int xj; // x's column
};
void next_states(state current, state next[4]){
next[0] = current;
next[1] = current;
next[2] = current;
next[3] = current;
if(current.xj-1>=0){ // moves 'x' left
next[0].puzzle[current.xi][current.xj] = current.puzzle[current.xi][current.xj-1];
next[0].puzzle[current.xi][current.xj-1] = 'x';
--next[0].xj;
} else {
next[0].valid = false;
}
if(current.xj+1<3){ // moves 'x' right
next[1].puzzle[current.xi][current.xj] = current.puzzle[current.xi][current.xj+1];
next[1].puzzle[current.xi][current.xj+1] = 'x';
++next[1].xj;
} else {
next[1].valid = false;
}
if(current.xi-1>=0){
next[2].puzzle[current.xi][current.xj] = current.puzzle[current.xi-1][current.xj];
next[2].puzzle[current.xi-1][current.xj] = 'x';
--next[2].xi;
} else {
next[2].valid = false;
}
if(current.xi+1<3){ // moves 'x'down
next[3].puzzle[current.xi][current.xj] = current.puzzle[current.xi+1][current.xj];
next[3].puzzle[current.xi+1][current.xj] = 'x';
++next[3].xi;
} else {
next[3].valid = false;
}
print(current.puzzle); // ERROR: accumulating all the changes above
}
Hat die Klasse einen richtigen Kopierkonstruktor und Kopierzuweisungsoperator? – NathanOliver
Hinweis: Wenn Sie denken, dass 'char **' ein 2D-Array ist, liegen Sie falsch. Es ist keines und kann nicht als eins verwendet werden. Verwenden Sie stattdessen ein 2D-Array. – Olaf
C und C++ sind verschiedene Sprachen! Wählen Sie die, die Sie tatsächlich verwenden, und entfernen Sie das falsche Tag! – Olaf