Springerproblem - Problem
-
Hallo,
ich habe ein Problem bei einer Programmieraufgabe.
Ziel ist, das sogenannte Springerproblem zu lösen. Ein Springer soll auf einem
selbst definierten Feld alle Zellen passieren, ohne auf einem doppelt zu landen.
Das Programm compiliert auch, allerdings sobald man die Feldgröße eingegeben hat, gibt er mir die Fehlermeldung dass die exe-Datei nicht mehr funktioniert.
Ich habe aber wirklich keine Ahnung woran das liegen kann.Nutze C++ und CodeBlocks.
#include <iostream> #include <vector> #include <iomanip> #include <cmath> using namespace std; int zeilen, spalten, groesse, gesVarianten = 8; vector<int>x_pos; vector<int>y_pos; vector<int>x_zug; vector<int>y_zug; vector<vector<int> >feld; bool pruefung(int i) { for (unsigned int l=0;l<x_pos.size()-1;l++) { if (y_pos[l]*zeilen+x_pos[l]!=y_pos[i]*zeilen+x_pos[i]); else return false; } return true; } bool neuerZug (int i, int j) { x_pos.push_back(x_pos[i-1]+x_zug[j]); y_pos.push_back(y_pos[i-1]+y_zug[j]); if (((x_pos[i]>=0) && (x_pos[i]<zeilen)) && ((y_pos[i]>=0) && (y_pos[i]<spalten))) { if (pruefung(i)) return true; else; } else return false; } void vektorgroesse() { x_zug.resize(gesVarianten); x_zug[0]=1; x_zug[1]=2; x_zug[2]=2; x_zug[3]=1; x_zug[4]=-1; x_zug[5]=-2; x_zug[6]=-2; x_zug[7]=-1; y_zug.resize(gesVarianten); y_zug[0]=2; y_zug[1]=1; y_zug[2]=-1; y_zug[3]=-2; y_zug[4]=-2; y_zug[5]=-1; y_zug[6]=1; y_zug[7]=2; feld.resize(zeilen,vector<int>(spalten,0)); } void loescheZug (int i) { x_pos.erase(x_pos.begin()+i); y_pos.erase(x_pos.begin()+i); } void druckeLoesung () { for (int i=0;i<groesse;++i) { feld[x_pos[i]][y_pos[i]]=i; } for (int i=0;i<zeilen;++i) { for (int j=0;j<spalten;++j) { cout << setw(3) << feld[i][j] << " |"; } cout << endl; } cout << endl; } void setze (int i, int j) { if(j>=gesVarianten) return; if(i>=groesse) { druckeLoesung(); cout << endl; return; } bool zugOK = neuerZug(i,j); if (zugOK) setze(i+1,0); loescheZug(i); setze(i,j+1); } int main() { cout << "Bitte Feldgroesse eingeben: " << endl; cin >> zeilen >> spalten; groesse=zeilen*spalten; vektorgroesse(); x_pos.push_back(0); y_pos.push_back(0); setze(1,0); return 0; }
-
if (((x_pos[i]>=0) && (x_pos[i]<zeilen)) && ((y_pos[i]>=0) && (y_pos[i]<spalten)))
Die Zeile gefällt mir nicht, kann mich aber auch irren.
Du hast in der Zeile zweimal x_pos[i]>=0, das passt meiner Ansicht nach nicht zusammen.Eine andere Sache wäre evtl, daß Du Vektoren wie Arrays behandelst, bei der Zuweisung von Werten z.B., eigentlich ist der Gebrauch von Iteratoren besser.
Aber auch hier bin ich mir nicht sicher. Können andere User ja sich mal zu äußern.
-
Nachtrag:
Ersten Teil meines Posts bitte ignorieren,hab mich verlesen, sry.
-
Erstmal danke für die fixe Antwort
Allerdings hat sich das Problem schon erledigt, einer meiner Kommilitonen hat mich drauf hingewiesen, dass hier
void loescheZug (int i) { x_pos.erase(x_pos.begin()+i); y_pos.erase(x_pos.begin()+i); }
x_pos.begin() ausversehen benutzt wurde anstatt y_pos.begin().
Zur ersten Anmerkung: dass es zweimal verwendet wurde seh ich jetzt nicht. Es wird ja einmal für x und einmal für y verglichen.
Zum Zweiten: das könnte sicherlich auch funktionieren, allerdings war in dieser Aufgabe ein Teil bereits als Pseudocode vorgegeben, wonach man programmieren sollte.
Vielen Dank nochmal für die Antwort
.