#!/usr/bin/perl -w

use strict;

$|=1;

my $DEBUG = 1;

my (@X, @Y);
$X[0]= -2; $Y[0]= -1;
$X[1]= -2; $Y[1]= +1;
$X[2]= +2; $Y[2]= -1;
$X[3]= +2; $Y[3]= +1;
$X[4]= -1; $Y[4]= -2;
$X[5]= -1; $Y[5]= +2;
$X[6]= +1; $Y[6]= -2;
$X[7]= +1; $Y[7]= +2;

my (@log, @a, $xx, $yy, $counter, $n, $cx, $cy, $ok, $c, $max, @logmax);

$max=0;

top:
  @log=();
# @logmax=();
@a=();
for my $i (1..8){
    $a[$i][$_]=0 for (1..8);
}
$a[1][1]=1;
$counter=1;
$xx=$yy=1;
push @log, "$xx,$yy";

loop:
  $n = int (rand(8));

try:
  $cx = $xx+$X[$n];
$cy = $yy+$Y[$n];
$ok=1;   # innocent until proben guilty
if ($cx < 1 || $cy < 1 || $cx > 8 || $cy > 8 || $a[$cx][$cy]>0) { $ok=0; }             # out of board or occupied
else{                                         # success!
    $counter++;
    if ($counter > $max){ 
	$max =$counter; 
#    if ($counter >= 59){
#	@logmax = @log;
#    }
    }
    $c=0;
# print "$counter \t $max\n" if $DEBUG;
    ($xx,$yy)=($cx,$cy);
    $a[$xx][$yy]=1;
    push @log, "$xx,$yy";
    if ($counter==64){
	$max=0;
	print "\a";
	open OUT, ">>", $0.".out" or die "Cannot open: $!";
	print scalar localtime(), "\n";
	print OUT $_, "\n" for (@log);
	print OUT "-" x 40, "\n";
	print "=" x 40 , "\n";
	close OUT;
#    goto top;
	exit 1;
    }
    goto loop;
}

$c++;     # FAIL is normal
if ($c >= 25 && $counter > 1){                         # no way - so go to init()
    print "$counter \t $max\n" if $DEBUG;
    goto top; #  unless (@logmax && $c > 26); 
#	for (reverse @log){
#	    ($xx,$yy) = split /\,/, $_;
#	    $a[$xx][$yy]=0;
#	    if ($_ eq $logmax[-1]){ 
#		$a[$xx][$yy]=1;
#		last; 
#	    }
#	}
#	@log = @logmax;
#	$counter = scalar @log;
#	goto loop;
}
if ($c >= 8){
    $n = ++$n % 8;
    goto try;
}
select (undef, undef, undef, 0.001);
goto loop;


__END__

