Hallo
Ich habe ein Problem mit Backtracking. Ein ähnliches Problem habe ich schon gestern ins C# Board geschrieben, und mein Code ist auch in C#. Allerdings bekomme ich da kaum Rückmeldung.
Darum (und weil es sowieso nichts sprachspezifisches ist, sondern der Algorithmu entscheidend ist) versuche ich es noch hier.
Also... Ich versuche per Backtracking jeden Weg aus einem Labyrinth zu finden. Die Zahlen, spielen dabei zunächst nur eine zweitrangige Rolle, und müssen auch gar nicht beachtet werden.
Mein Problem ist, dass ich - einmal in einer Sackgasse angekommen - nciht mehr rauskomme, und das Programm frühzeitig beendet.
Hier der Code (lasst euch nicht einschüchtern, das meiste ist nur die switch/case anweisung):
Eigentlich sollte er, wenn er in eine Sackgasse kommt, und alle wege versperrt sind false zurückgeben, und die aktion also gar nicht machen:
Da es doch ganz schön kompliziert ist (wie ich finde), habe ich euch schnell ein Bild erstellt.
Bei Schritt 2 schaut er zuerst rechts. -> ist nicht gespert, also rein da.
In Schritt 3 sieht schaut er rechts -> false, unten -> false, links -> false, oben -> false, also gibt die funktion (if(findBestPath()) { }) false zurück.
Er hat also schritt 2 zu 3 (nach rechts) gar nie gemacht, und versuchts nun neu in schritt 2 unten, wo er fündig wird.
Hoffe ihr wiss was ich meine
Ich habe ein Problem mit Backtracking. Ein ähnliches Problem habe ich schon gestern ins C# Board geschrieben, und mein Code ist auch in C#. Allerdings bekomme ich da kaum Rückmeldung.
Darum (und weil es sowieso nichts sprachspezifisches ist, sondern der Algorithmu entscheidend ist) versuche ich es noch hier.
Also... Ich versuche per Backtracking jeden Weg aus einem Labyrinth zu finden. Die Zahlen, spielen dabei zunächst nur eine zweitrangige Rolle, und müssen auch gar nicht beachtet werden.
Mein Problem ist, dass ich - einmal in einer Sackgasse angekommen - nciht mehr rauskomme, und das Programm frühzeitig beendet.
Hier der Code (lasst euch nicht einschüchtern, das meiste ist nur die switch/case anweisung):
Code:
using System;
namespace sonja
{
class SOI_BackTrack
{
[STAThread]
public static void Main(string[] args)
{
int actTime = 0;
findBestPath('x', actTime);
Console.WriteLine(bestTime);
Console.ReadLine();
Console.ReadLine();
}
static int r=0, s=0, bestTime=32000; // r=Reihe s=Spalte
/*static char[,] Lab = {{'A','1','4','7','X'},
{'1','9','5','X','2'},
{'X','4','6','7','9'},
{'1','X','9','1','1'},
{'7','9','3','7','E'}};*/
static char[,] Lab = {{'A','X','X','X','X'},
{'1','X','5','X','2'},
{'5','X','6','7','9'},
{'1','X','X','X','X'},
{'7','9','3','7','E'}};
public static bool findBestPath(char compass, int actTime)
{
switch(compass)
{
case 'x': break;
case 'r':
if((s+1 <= 4) && (Lab[r,s+1] != 'X'))
{
Lab[r,s] = 'X';
s++;
if ((Lab[r,s] != 'E') && (Lab[r,s] != 'A'))
{
actTime += Convert.ToInt32(Lab[r,s].ToString());
}
} else {
return (false);
} break;
case 'u':
if((r+1 <= 4) && (Lab[r+1,s] != 'X'))
{
Lab[r,s] = 'X';
r++;
if ((Lab[r,s] != 'E') && (Lab[r,s] != 'A'))
{
actTime += Convert.ToInt32(Lab[r,s].ToString());
}
} else {
return (false);
} break;
case 'l':
if((s-1 >= 0) && (Lab[r,s-1] != 'X'))
{
Lab[r,s] = 'X';
s--;
if ((Lab[r,s] != 'E') && (Lab[r,s] != 'A'))
{
actTime += Convert.ToInt32(Lab[r,s].ToString());
}
} else {
return (false);
} break;
case 'o':
if((r-1 >= 0) && (Lab[r-1,s] != 'X'))
{
Lab[r,s] = 'X';
r--;
if ((Lab[r,s] != 'E') && (Lab[r,s] != 'A'))
{
actTime += Convert.ToInt32(Lab[r,s].ToString());
}
} else {
return (false);
} break;
default: return (false);
}
Console.Write(Lab[r,s]);
Console.WriteLine(" - " + actTime);
if(Lab[r,s] == 'E')
{
if(actTime < bestTime)
{
bestTime = actTime;
}
Console.Write("we are the Best");
return (false);
}
if(findBestPath('r', actTime)){ }
if(findBestPath('u', actTime)){ }
if(findBestPath('l', actTime)){ }
if(findBestPath('o', actTime)){ }
return (false);
}
}
}
Eigentlich sollte er, wenn er in eine Sackgasse kommt, und alle wege versperrt sind false zurückgeben, und die aktion also gar nicht machen:
Code:
if(findBestPath('r', actTime)){ }
if(findBestPath('u', actTime)){ }
if(findBestPath('l', actTime)){ }
if(findBestPath('o', actTime)){ }
return (false);
Da es doch ganz schön kompliziert ist (wie ich finde), habe ich euch schnell ein Bild erstellt.
Bei Schritt 2 schaut er zuerst rechts. -> ist nicht gespert, also rein da.
In Schritt 3 sieht schaut er rechts -> false, unten -> false, links -> false, oben -> false, also gibt die funktion (if(findBestPath()) { }) false zurück.
Er hat also schritt 2 zu 3 (nach rechts) gar nie gemacht, und versuchts nun neu in schritt 2 unten, wo er fündig wird.
Hoffe ihr wiss was ich meine