one step beyong in resolution, still not finding all alternate path
add showAll button reset maze size display at maze size change
This commit is contained in:
@@ -436,6 +436,11 @@ TODO
|
||||
{
|
||||
depth = 0;
|
||||
computeOpenList();
|
||||
resetResolving();
|
||||
}
|
||||
|
||||
public void resetResolving()
|
||||
{
|
||||
// don't keep solved path
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
@@ -443,7 +448,6 @@ TODO
|
||||
{
|
||||
t[x][y] &= ~(SOLVED);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -601,6 +605,16 @@ TODO
|
||||
return ((check & flag) == flag);
|
||||
}
|
||||
|
||||
public final short getCell(Position p)
|
||||
{
|
||||
return t[p.getX()][p.getY()];
|
||||
}
|
||||
|
||||
public final void updateCell(Position p, short flags)
|
||||
{
|
||||
t[p.getX()][p.getY()] |= flags;
|
||||
}
|
||||
|
||||
public final static short getReverseDirection(int index)
|
||||
{
|
||||
return AllDirections[(index + 2) % 4];
|
||||
@@ -637,14 +651,16 @@ TODO
|
||||
|
||||
/**
|
||||
* resolve this labrynth using internal representation
|
||||
* initial (x,y) is exit, will return list of positions from start to end.
|
||||
* initial (x,y) is exit, will return list of positions from start (0,0) to end (x,y)
|
||||
**/
|
||||
public LinkedList<DirectionPosition> resolve(int x, int y, MazeResolutionListener rlistener)
|
||||
{
|
||||
long safeguard = width * height;
|
||||
short selectedDirection = 0;
|
||||
int newx = x;
|
||||
int newy = y;
|
||||
int newx = 0;
|
||||
int newy = 0;
|
||||
|
||||
resetResolving();
|
||||
|
||||
// list of alternate paths
|
||||
LinkedList<LinkedList<DirectionPosition>> altpath = new LinkedList<>();
|
||||
@@ -653,15 +669,12 @@ TODO
|
||||
LinkedList<DirectionPosition> backpath = new LinkedList<DirectionPosition>();
|
||||
// position that point to (x,y).
|
||||
DirectionPosition found = new DirectionPosition(selectedDirection,new Position(x, y));
|
||||
// entry
|
||||
Position entry = new Position(0, 0);
|
||||
|
||||
while (!((newx == 0) && (newy == 0)))
|
||||
while (! found.getPosition().equals(entry) )
|
||||
{
|
||||
if (( x == newx ) && ( y == newy ))
|
||||
{
|
||||
System.out.println("[ERROR] path contains same consecutive point" + new Position(newx, newy).toString());
|
||||
}
|
||||
x = newx;
|
||||
y = newy;
|
||||
Position last = found.getPosition();
|
||||
backpath.addFirst(found);
|
||||
found = null;
|
||||
|
||||
@@ -688,14 +701,14 @@ TODO
|
||||
|
||||
if (isFlagSet(direction,HORIZONTAL))
|
||||
{
|
||||
newx = x + delta;
|
||||
newy = y;
|
||||
newx = last.getX() + delta;
|
||||
newy = last.getY();
|
||||
pointingdirection |= HORIZONTAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
newy = y + delta;
|
||||
newx = x;
|
||||
newy = last.getY() + delta;
|
||||
newx = last.getX();
|
||||
pointingdirection |= VERTICAL;
|
||||
}
|
||||
|
||||
@@ -707,9 +720,11 @@ TODO
|
||||
return backpath;
|
||||
}
|
||||
|
||||
Position p = new Position(newx,newy);
|
||||
if ((newx >= 0) && (newy >= 0) && (newx < width) && (newy < height))
|
||||
{
|
||||
if (isFlagSet(t[newx][newy],reversedirection))
|
||||
System.out.println("check " + p);
|
||||
if (isFlagSet(getCell(p),reversedirection))
|
||||
{
|
||||
if (found != null)
|
||||
{
|
||||
@@ -719,12 +734,10 @@ TODO
|
||||
// ie entry(0,0) exit(width-1,height-1) not yet
|
||||
// implemented.
|
||||
{
|
||||
int ax = found.getPosition().getX();
|
||||
int ay = found.getPosition().getY();
|
||||
if (! isFlagSet(t[newx][newy], SOLVED ))
|
||||
if (! isFlagSet(getCell(p), SOLVED ))
|
||||
{
|
||||
LinkedList<DirectionPosition> cp = (LinkedList<DirectionPosition>) backpath.clone();
|
||||
DirectionPosition altfound = new DirectionPosition(selectedDirection,new Position(newx, newy));
|
||||
DirectionPosition altfound = new DirectionPosition(reversedirection,p);
|
||||
cp.addFirst(altfound);
|
||||
altpath.addLast(cp);
|
||||
}
|
||||
@@ -734,21 +747,21 @@ TODO
|
||||
if (rlistener != null)
|
||||
{
|
||||
rlistener.notifySearchError("Loop : two parents " + found.toString() + " "
|
||||
+ new Position(newx, newy).toString());
|
||||
+ p.toString());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
selectedDirection=reversedirection;
|
||||
if (isFlagSet(t[newx][newy], SOLVED ))
|
||||
if (isFlagSet(getCell(p), SOLVED ))
|
||||
{
|
||||
// was already solved.
|
||||
found = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
found = new DirectionPosition(selectedDirection,new Position(newx, newy));
|
||||
found = new DirectionPosition(selectedDirection,p);
|
||||
if (rlistener != null)
|
||||
{
|
||||
rlistener.notifySearch(found);
|
||||
@@ -758,6 +771,10 @@ TODO
|
||||
// break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("p outofbounds " + p);
|
||||
}
|
||||
}
|
||||
if (found == null)
|
||||
{
|
||||
@@ -780,15 +797,13 @@ TODO
|
||||
break;
|
||||
}
|
||||
// System.out.println(found);
|
||||
newx = found.getPosition().getX();
|
||||
newy = found.getPosition().getY();
|
||||
if (isFlagSet(t[newx][newy], SOLVED ))
|
||||
if (isFlagSet(getCell(found.getPosition()), SOLVED ))
|
||||
{
|
||||
System.out.println("[INFO] position already solved" + found.toString() + " *length:" + backpath.size());
|
||||
}
|
||||
else
|
||||
{
|
||||
t[newx][newy] |= SOLVED;
|
||||
updateCell(found.getPosition(),SOLVED);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user