#!/usr/bin/perl -w

use strict;

my @c = (0,8,5,4,1,2,3,6,7);
my $zero = 0;
my @pos = ( 
    [1,3,],
    [0,2,4,],
    [1,5,],
    [0,4,6,],
    [1,3,5,7,],
    [2,4,8,],
    [3,7,],
    [6,4,8,],
    [5,7,],
);
my @end = 0..8;
my $min = 999_999_999;
my ($r, $count, $cost, @sol, $zerosol); 

do {
    $r = $pos[$zero][int rand( scalar( @{$pos[$zero]} ))] ; 
    ($c[$zero], $c[$r]) = ($c[$r], $c[$zero]);    
    $zero = $r;
    
    $cost =0;
    $cost += ($_-$c[$_])**2 for (@end);
    if ($cost < $min){
	print "$cost\n";
	$min = $cost;
	@sol = @c;
	$zerosol = $zero;
    }elsif (++$count % 100 ==0){
	@c = @sol;
	$zero = $zerosol;
    }
}until ($cost == 0);


__END__
We have a matrix 3x3 with a hole to slide
  other numbers into that position.
  
An initial arrangement could be:
  
  - 8 5
  4 1 2
  3 6 7
  
and we want to play until the numbers
  are ordered as
  
  - 1 2
  3 4 5
  6 7 8
  
Beware: not all initial positions can
  lead to a solution.
  
Can you write an algorithm that lead
  to a solution and predict when there
  isn't?
  

Cheers
  