Solution created in $time seconds\n
";
//Return an array of effected tiles.
function getEffected($route) {
//Determin starting location.
$start = explode(",", $route['start']);
$x=$start[0];
$y=$start[1];
//Run through the path
$pathary = str_split($route['path']);
foreach ($pathary as $position => $char) {
switch($char) {
case 1: $y--; break; //up
case 2: $x++; break; //right
case 3: $y++; break; //down
case 4: $x--; break; //left
default: continue 2;
}
//add the positions
$effected["$y,$x"]++;
}
//arsort($effected);
return $effected;
}
// http://awesomescreenshot.com/0d7nyx9b2
function executeTryMaze($mapMatrix, $intensity = 1) {
$mapdata['height'] = $mapMatrix[0][0];
$mapdata['width'] = $mapMatrix[0][1];
$mapdata['points'] = $mapMatrix[0][2];
$mapdata['rocks'] = $mapMatrix[0][3];
$mapdata['walls'] = $mapMatrix[0][4];
//Override hack.
//$mapdata['walls'] = 12;
$mapdata['teleports'] = $mapMatrix[0][5];
//PROCSES BEGIN
$wallcount = 0;
$iterations = 0;
$lastRefresh = 0;
do {
$iterations++;
$done = false;
$path = routePath($mapMatrix);
$effected = getEffected($path);
$curcount = 1000;
$bestmoves = $path['moves'] - 1;
foreach ($effected as $position => $count) {
//Find location
$loc = explode(",", $position);
$x=$loc[0];
$y=$loc[1];
//Is it open?
if ($mapMatrix[$x][$y] != "o") {
continue;
}
//Set a wall and calculate the new path
$mapMatrix[$x][$y] = 'R';
$curpath = routePath($mapMatrix);
$trymoves = $curpath['moves'];
//echo "T($x,$y)\n:";
//path blocked?
if ($curpath['blocked'] == true) {
//Sometimes it's better to remove a different wall;
//Put a wall here.
$arrayWalls[$x][$y] = true;
//determin wall values.
$walllist = wallvalues($mapMatrix, $arrayWalls);
//Put the best wall to remove on top; - A mono directional bubble sort would be better here.
$walllist["$x,$y"]++;
asort($walllist);
//Get location of wall to remove.
$nwallposition = key($walllist);
echo "*$nwallposition vs $x,$y*\n";
$nloc = explode(",", $nwallposition);
$x=$nloc[0];
$y=$nloc[1];
//Remove that wall instead.
$mapMatrix[$x][$y] = 'o';
//echo "Rem[$x,$y]";
//$curpath = routePath($mapMatrix);
//echo $curpath['blocked'];
//echo "]";
unset($arrayWalls[$x][$y]);
continue;
}
//The last choice, or first choice?
//if ($trymoves >= $bestmoves) {
if ($trymoves >= $bestmoves) {
$bestmoves = $trymoves;
$bestx = $x;
$besty = $y;
$mapMatrix[$x][$y] = 'o';
break;
}
$mapMatrix[$x][$y] = 'o';
}
//Place the wall in the best spot we found;
$arrayWalls[$bestx][$besty] = true;
echo $mapMatrix[$bestx][$besty];
$mapMatrix[$bestx][$besty] = 'R';
$wallcount++;
echo "B($bestx,$besty)\n:";
//Refresh walls (Remove obsolete walls)
if ($iterations % 4 == 0 AND $wallcount > ($mapdata['walls'] * .6))
{
echo "RW";
$walllist = wallvalues($mapMatrix, $arrayWalls);
//Remove low valued wall;
$lowvaluewall = true;
$nullwalls = 0;
foreach ($walllist as $nwallposition => $wallvalue) {
if ($wallvalue == 0 OR ($lowvaluewall == true AND $wallvalue == 1))
{
$nloc = explode(",", $nwallposition);
$x=$nloc[0];
$y=$nloc[1];
$mapMatrix[$x][$y] = 'o';
unset($arrayWalls[$x][$y]);
$wallcount--;
$nullwalls++;
if ($nullwalls >= 2) {
break;
}
if ($lowvaluewall == true AND $wallvalue == 1) {
$lowvaluewall = false;
}
}
}
}
//Refresh walls if we hit the wall count limit, once.
if($wallcount >= $mapdata['walls'] && $lastRefresh == 0)
{
$lastRefresh = 1;
$walllist = wallvalue($mapMatrix, "R");
foreach ($walllist as $nwallposition => $wallvalue) {
if ($wallvalue <= 1) {
$nloc = explode(",", $nwallposition);
$i=$nloc[0];
$j=$nloc[1];
$mapMatrix[$i][$j] = 'o';
$wallcount--;
}
}
echo "End Refresh walls to:[$wallcount]";
}
//If all walls are placed even after refresh, we're done
if ($wallcount >= $mapdata['walls']) {
echo "END;($wallcount)";
break;
}
} while ($done == false);
echo "print";
print_r(wallvalue($mapMatrix, "R"));
echo "endprint";
return $mapMatrix;
}
//Returns the essential 'move value' of individual walls in an array.
function wallValues($mapMatrix, $arrayWalls) {
$curpath = routePath($mapMatrix);
$curmoves = $curpath['moves'];
//Prepare to return an array.
$r = Array();
foreach ($arrayWalls as $x => $a) {
foreach ($a as $y => $v) {
//echo "{O".$mapMatrix[$x][$y]."O}";
if ($mapMatrix[$x][$y] <> 'R') {
continue;
}
//Imagine the maze without the wall.
$mapMatrix[$x][$y] = 'o';
$newpath = routePath($mapMatrix);
$newmoves = $newpath['moves'];
//Great; so the value of that wall is:
$r["$x,$y"] = $curmoves - $newmoves;
//Okay, you can have your wall back.
$mapMatrix[$x][$y] = 'R';
}
}
return $r;
}
//Returns the essential 'move value' of a wall.
function wallvalue($mapMatrix, $wall) {
$curpath = routePath($mapMatrix);
$curmoves = $curpath['moves'];
for( $i = 1; $i <= $mapMatrix[0][1]; $i++) { //Number of Rows
for( $j = 0; $j < $mapMatrix[0][0]; $j++) { //Number of Columns
if ($mapMatrix[$i][$j] == $wall) {
$mapMatrix[$i][$j] = 'o';
$newpath = routePath($mapMatrix);
$mapMatrix[$i][$j] = 'r';
$newmoves = $newpath['moves'];
$r["$i,$j"] = $curmoves - $newmoves;
}
}
}
return $r;
}
echo "
Path: ";
echo $bla['moves'];
echo "
";
$mapdisplay = DisplayMap($map);
$code = GenerateMapCode($map);
echo "
$mapdisplay";
echo "
$code";
print_r ($map);
echo "
";
echo "
";
echo "
";
echo weight(1,2,3,4,5,6);
echo "
";
echo weight(1,2,3,4,5,6);
echo "
";
echo weight(1,2,3,4,5,6);
echo "
";
echo weight(1,2,3,4,5,6);
echo "
";
echo weight(1,2,3,4,5,6);
echo "
";
echo weight(1,2,3,4,5,6);
?>