#!/usr/bin/php
<?php
class GridHelper
{
private $d1 = 1;
private $d2 = 1;
private $saved_paths = array();
private $visited = array("1,1"=>true);
private $path = "";
private $fail = 0;
public function __tostring()
{
return "GridHelper";
}
public function seek()
{
while ($this->fail < 2000)
{
$this->reset();
$this->path();
}
return count($this->saved_paths);
}
public function path()
{
$point = $this->getNextPoint();
$point_as_string = join(",",$point);
if ($point_as_string == "0,0")
{
$this->fail += 1;
$this->path = "";
return;
}
if ($point_as_string == "4,4")
{
if (!isset($this->saved_paths[$this->path]))
{
$this->saved_paths[$this->path] = $this->path;
$this->fail = 0;
}
$this->path = "";
return;
}
return $this->path();
}
public function reset()
{
$this->d1 = 1;
$this->d2 = 1;
$this->visited = array("1,1"=>true);
}
private function getNextPoint()
{
$x = array();
if (($this->d1 != 1)&&
(!isset($this->visited[join(",",array($this->d1 -1,$this->d2))])))
{
array_push($x,array($this->d1 -1,$this->d2));
}
if (($this->d1 != 4)
&&(!isset($this->visited[join(",",array($this->d1 +1,$this->d2))])))
{
array_push($x,array($this->d1 +1,$this->d2));
}
if (($this->d2 != 1)
&&(!isset($this->visited[join(",",array($this->d1,$this->d2 -1))])))
{
array_push($x,array($this->d1,$this->d2 -1));
}
if (($this->d2 != 4)&&
(!isset($this->visited[join(",",array($this->d1,$this->d2 +1))])))
{
array_push($x,array($this->d1,$this->d2 +1));
}
$l = count($x);
$new_point_array = array(0,0);
if ($l > 0)
{
shuffle($x);
$new_point_array = $x[array_rand($x,1)];
$this->d1 = $new_point_array[0];
$this->d2 = $new_point_array[1];
$new_point_array_as_string = join(",",$new_point_array);
$this->visited[$new_point_array_as_string] = true;
$this->path .= $new_point_array_as_string." ";
}
return $new_point_array;
}
}
$g = new GridHelper();
print $g->seek()."\n";
exit;
?>
IyEvdXNyL2Jpbi9waHAKPD9waHAKIAogICAgY2xhc3MgR3JpZEhlbHBlciAKICAgICAgICB7CiAgICAgICAgcHJpdmF0ZSAkZDEgPSAxOwogICAgICAgIHByaXZhdGUgJGQyID0gMTsKICAgICAgICAKICAgICAgICBwcml2YXRlICRzYXZlZF9wYXRocyA9IGFycmF5KCk7CiAgICAgICAgcHJpdmF0ZSAkdmlzaXRlZCA9IGFycmF5KCIxLDEiPT50cnVlKTsKICAgICAgICBwcml2YXRlICRwYXRoID0gIiI7ICAgICAgICAKICAgICAgICBwcml2YXRlICRmYWlsID0gMDsKICAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKSAKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiR3JpZEhlbHBlciI7CiAgICAgICAgfQogICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNlZWsoKSAKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+ZmFpbCA8IDIwMDApIAogICAgICAgIHsKICAgICAgICAgICAgICAgICR0aGlzLT5yZXNldCgpOwogICAgICAgICAgICAgICAgJHRoaXMtPnBhdGgoKTsKICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQoJHRoaXMtPnNhdmVkX3BhdGhzKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIHBhdGgoKSAKCXsKICAgICAgICAgICAgJHBvaW50ID0gJHRoaXMtPmdldE5leHRQb2ludCgpOwogICAgICAgICAgICAkcG9pbnRfYXNfc3RyaW5nID0gam9pbigiLCIsJHBvaW50KTsKICAgICAgICAgICAgaWYgKCRwb2ludF9hc19zdHJpbmcgPT0gIjAsMCIpIAoJICAgIHsgCiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFpbCArPSAxOyAKICAgICAgICAgICAgICAgICR0aGlzLT5wYXRoID0gIiI7CiAgICAgICAgICAgICAgICByZXR1cm47IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcG9pbnRfYXNfc3RyaW5nID09ICI0LDQiKSAKCSAgICB7IAogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+c2F2ZWRfcGF0aHNbJHRoaXMtPnBhdGhdKSkgCgkJewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zYXZlZF9wYXRoc1skdGhpcy0+cGF0aF0gPSAkdGhpcy0+cGF0aDsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFpbCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+cGF0aCA9ICIiOwogICAgICAgICAgICAgICAgcmV0dXJuOyAKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBhdGgoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkgCgl7CiAgICAgICAgICAgICR0aGlzLT5kMSA9IDE7CiAgICAgICAgICAgICR0aGlzLT5kMiA9IDE7CiAgICAgICAgICAgICR0aGlzLT52aXNpdGVkID0gYXJyYXkoIjEsMSI9PnRydWUpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBwcml2YXRlIGZ1bmN0aW9uIGdldE5leHRQb2ludCgpIAoJewogICAgICAgICAgICAkeCA9IGFycmF5KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoKCR0aGlzLT5kMSAhPSAxKSYmCiAgICAgICAgICAgICAgICAoIWlzc2V0KCR0aGlzLT52aXNpdGVkW2pvaW4oIiwiLGFycmF5KCR0aGlzLT5kMSAtMSwkdGhpcy0+ZDIpKV0pKSkgCgkgICAgICB7IAogICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR4LGFycmF5KCR0aGlzLT5kMSAtMSwkdGhpcy0+ZDIpKTsgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCR0aGlzLT5kMSAhPSA0KQogICAgICAgICAgICAgICAgJiYoIWlzc2V0KCR0aGlzLT52aXNpdGVkW2pvaW4oIiwiLGFycmF5KCR0aGlzLT5kMSArMSwkdGhpcy0+ZDIpKV0pKSkgCgkgICAgICB7IAogICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR4LGFycmF5KCR0aGlzLT5kMSArMSwkdGhpcy0+ZDIpKTsgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCR0aGlzLT5kMiAhPSAxKQogICAgICAgICAgICAgICAgJiYoIWlzc2V0KCR0aGlzLT52aXNpdGVkW2pvaW4oIiwiLGFycmF5KCR0aGlzLT5kMSwkdGhpcy0+ZDIgLTEpKV0pKSkgCgkgICAgICB7IAogICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCR4LGFycmF5KCR0aGlzLT5kMSwkdGhpcy0+ZDIgLTEpKTsgCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCR0aGlzLT5kMiAhPSA0KSYmCgkgICAgICAgICghaXNzZXQoJHRoaXMtPnZpc2l0ZWRbam9pbigiLCIsYXJyYXkoJHRoaXMtPmQxLCR0aGlzLT5kMiArMSkpXSkpKQoJICAgICAgeyAKICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkeCxhcnJheSgkdGhpcy0+ZDEsJHRoaXMtPmQyICsxKSk7IAogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAkbCA9IGNvdW50KCR4KTsKICAgICAgICAgICAgJG5ld19wb2ludF9hcnJheSA9IGFycmF5KDAsMCk7IAogICAgICAgICAgICBpZiAoJGwgPiAwKSAKCSAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAJICBzaHVmZmxlKCR4KTsKICAgICAgICAgICAJICAkbmV3X3BvaW50X2FycmF5ID0gJHhbYXJyYXlfcmFuZCgkeCwxKV07CiAgICAgICAgICAJICAkdGhpcy0+ZDEgPSAkbmV3X3BvaW50X2FycmF5WzBdOwogICAgICAgICAgICAJICAkdGhpcy0+ZDIgPSAkbmV3X3BvaW50X2FycmF5WzFdOwogICAgICAgICAgIAkgICRuZXdfcG9pbnRfYXJyYXlfYXNfc3RyaW5nID0gam9pbigiLCIsJG5ld19wb2ludF9hcnJheSk7CiAgICAgICAgICAJICAkdGhpcy0+dmlzaXRlZFskbmV3X3BvaW50X2FycmF5X2FzX3N0cmluZ10gPSB0cnVlOwogICAgICAgICAgICAgICAJICAkdGhpcy0+cGF0aCAuPSAkbmV3X3BvaW50X2FycmF5X2FzX3N0cmluZy4iICI7CiAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgcmV0dXJuICRuZXdfcG9pbnRfYXJyYXk7CiAgICAgICAgfQogICAgCiAgICB9CiAgICAKICAgICRnID0gbmV3IEdyaWRIZWxwZXIoKTsKICAgIHByaW50ICRnLT5zZWVrKCkuIlxuIjsKIAogICAgZXhpdDsKPz4=