Archive pour février 2014

Résolution boggle

Lundi 17 février 2014

Voici un petit challange personelle de resolution de boogle:
[sourcecode language="php"]
$file = fopen("liste_francais.txt","r");

$dic = array();
while( $line = fgets($file) )
{
$dic[] = trim($line) ;
}

function findInDico( $dic, $word, &$exact ) {
$len = strlen($word);
$exact = false ;
foreach ( $dic as $item )
if ( substr( $item, 0, $len ) == $word ) {
$exact = ( $len == strlen( $item ) );
return true ;
}
return false ;
}

$boggle = array( array( ‘t’, ‘a’, ‘u’, ‘t’ ), array( ‘i’, ‘m’, ‘d’, ‘i’ ), array( ‘a’, ‘n’, ‘g’, ‘e’ ), array( ‘b’, ‘n’, ‘i’, ‘e’ ) );

function get( $arr, $pos )
{
return $arr[ $pos[0] ] [ $pos[1] ] ;
}

function dirNext( $dir, $pos, $occup ) {
$p = $pos ;
switch( $dir ) {
case 0 :
$p[1]–;
break ;
case 1 :
$p[0]++;$p[1]–;
break ;
case 2 :
$p[0]++;
break ;
case 3 :
$p[0]++;$p[1]++;
break ;
case 4 :
$p[1]++;
break ;
case 5 :
$p[0]–;$p[1]++;
break ;
case 6 :
$p[0]–;
break ;
case 7 :
$p[0]–;$p[1]–;
break ;
}
if ( ($p[0] < 0) || ($p[1] < 0) )
return false ;
if ( ($p[0] > 3) || ($p[1] > 3) )
return false ;
if ( $occup[$p[0]][$p[1]] )
return false ;
return $p ;
}

function bnext( $arr, $buff, $pos, $occup )
{
global $dic ;
//On ajoute cette nouvelle lettre
$buff .= get( $arr, $pos );
//On marque la place ocuppe
$occup[$pos[0]][$pos[1]] = true ;
//Ce mot exite ?
if ( findInDico( $dic, $buff, $exact ) == false ) {
return false; //non on arrete la
} else {
if ( $exact )
echo "Trouvé: $buff \n" ; //. (($exact)?"True":"False") . "\n" ;
}

$bret = true ;
for($i=0;$i<8;$i++)
{
if ( $p = dirNext( $i, $pos, $occup ) ) {
bnext( $arr, $buff, $p, $occup );
}
}
return false ;
}

for( $y=0;$y<4; $y++ ) {
for( $x=0;$x<4; $x++ ) {
$occup = array();
for ($i=0;$i<4;$i++)
$occup[] = array( 0, 0, 0, 0 );

bnext ( $boggle,  », array($x,$y), $occup );
}
}
echo "\n" ;
[/sourcecode]