nbezzala has asked for the wisdom of the Perl Monks concerning the following question:
#! /usr/bin/perl use strict; use warnings; use Data::Dumper; my $puzzle_board = create_board(); solve ($puzzle_board); print_board ($puzzle_board); sub solve { my $board = shift @_; my $move = 1; my ($x, $y) = (0, 1); # Change this number to solve more or less of the puzzle while ( $move < 44 ) { my ($newx, $newy) = calculate_move($board, $x, $y); print "$move: $x,$y->$newx,$newy\t"; if ( verify_move($board, $newx, $newy) == 1 ) { forward($board, $x, $y, $newx, $newy); } elsif ( $board->[$x][$y]{trial} < 7 ) { $board->[$x][$y]{trial}++; next; } else { back($board, $x, $y, $newx, $newy); $x = $board->[$newx][$newy]{oldx}; $y = $board->[$newx][$newy]{oldy}; $move--; next; } ($x, $y) = ($newx, $newy); $move++; } } sub forward { my ($board, $x, $y, $newx, $newy) = @_; $board->[$newx][$newy]->{visited} = $board->[$x][$y]->{visited} + + 1; $board->[$newx][$newy]->{oldx} = $x; $board->[$newx][$newy]->{oldy} = $y; } sub back { my ($board, $x, $y, $newx, $newy) = @_; $board->[$newx][$newy]{trial} = 0; $board->[$newx][$newy]{visited} = 0; } # Assumes that it is passed valid x and y values in the board. sub calculate_move { my ($board, $x, $y) = @_; my ($newx, $newy) = 0; if ($board->[$x][$y]{trial} == 0) { $newx = $x + 1; $newy = $y + 2; } if ($board->[$x][$y]{trial} == 1) { $newx = $x - 1; $newy = $y + 2; } if ($board->[$x][$y]{trial} == 2) { $newx = $x + 1; $newy = $y - 2; } if ($board->[$x][$y]{trial} == 3) { $newx = $x - 1; $newy = $y - 2; } if ($board->[$x][$y]{trial} == 4) { $newx = $x + 2; $newy = $y + 1; } if ($board->[$x][$y]{trial} == 5) { $newx = $x - 2; $newy = $y + 1; } if ($board->[$x][$y]{trial} == 6) { $newx = $x + 2; $newy = $y - 1; } if ($board->[$x][$y]{trial} == 7) { $newx = $x - 2; $newy = $y - 1; } return ($newx, $newy); } sub verify_move { my ($board, $x, $y) = @_; if ($x > 7 || $x < 0 || $y > 7 || $y < 0) { return 0; } if ($board->[$x][$y]{visited} > 0) { return 0; } return 1; } sub create_board { my @board; my ($i, $j); for ( $i = 0; $i < 8; $i++ ) { for ( $j = 0; $j < 8; $j++ ) { $board[$i][$j] = { x => $i, y => $j, visited => 0, trial => 0, oldx => 0, oldy => 0 } } } $board[0][1] = { x => 0, y => 1, visited => 1, trial => 0 }; return \@board; } sub print_board { my $board_ref = shift @_; my ($i, $j); print Dumper $board_ref; print "\nThe Chess Board\n"; for ($i = 7; $i >= 0; $i--) { for ($j = 0; $j < 8; $j++) { printf ("%02d ", $board_ref->[$i][$j]{visited} ); } print "\n\n"; } }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: How to debug a long while loop
by BrowserUk (Patriarch) on May 17, 2007 at 12:01 UTC | |
Re: How to debug a long while loop
by liverpole (Monsignor) on May 17, 2007 at 19:32 UTC | |
Re: How to debug a long while loop
by roboticus (Chancellor) on May 17, 2007 at 13:09 UTC | |
by roboticus (Chancellor) on May 17, 2007 at 14:22 UTC | |
Re: How to debug a long while loop
by roboticus (Chancellor) on May 17, 2007 at 14:36 UTC |