use strict; my (@data, %words, $my, $mx, $x, $y); for () { chomp; split //; s/ // for @_; push @data, [@_]; } $my = $#data; $mx = $#{$data[0]}; for $y (0..$my) { for $x (0..$mx) { if ($data[$y][$x]) { traverse('', 8, $x, $y, @data); } } } print scalar keys %words; sub traverse { my ($w, $d, $x, $y) = @_[0..3]; my @d = map {[@$_]} @_[4..$#_]; $w .= $d[$y][$x]; $words{$w} = () if !exists $words{$w}; return if !--$d; $d[$y][$x] = ''; if ($y > 0 && $x > 0 && $d[($y-1)][($x-1)]) { traverse($w, $d, ($x-1), ($y-1), @d); } if ($y < $my && $x > 0 && $d[($y+1)][($x-1)]) { traverse($w, $d, ($x-1), ($y+1), @d); } if ($y > 0 && $x < $mx && $d[($y-1)][($x+1)]) { traverse($w, $d, ($x+1), ($y-1), @d); } if ($y < $my && $x < $mx && $d[($y+1)][($x+1)]) { traverse($w, $d, ($x+1), ($y+1), @d); } } __DATA__ A J S B K F O X G B K T C L G P Y H C L U D M H Q Z I D M V E N I R A J E N W F O