Desafío Sudoku
#3 Solución de panino
Ver código
|
Ver comentarios (1)
|
Descargar código
Fecha: 12 febrero 2006
Tamaño: 59164 caracteres
Comentarios: 1
Solución online:
http://www.disegnocentell.com.ar/didi/sudoku.php
Valoración









8.00
(2 votos)
No ha realizado ningún comentario
Valora esta solución
<?php
ob_start();
error_reporting(E_ALL);
@ini_set('display_errors', '1');
function microtime_float(){
list($useg, $seg) = explode(" ", microtime());
return ((float)$useg + (float)$seg);
}
function cargar(){
global $inicio;
global $sudoku;
global $filas;
global $digitos;
$inicio=microtime_float();
$archivo=file('sudoku.txt');
$filas=count($archivo);
if(pow(intval(sqrt($filas)),2)!=$filas){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku no regular<br/><a href="sudoku.php" stile="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a></div>';exit;}
$digitos=strlen($filas)+1;
$posibles='';
for($k=1;$k<($filas+1);$k++){
$posibles.=sprintf("%'-".$digitos."s",$k);
}
for($i=0;$i<$filas;$i++){
$pp=$archivo[$i];
$pp=str_replace(' ','-',$pp);
$pp=str_replace(' ','-',$pp);
while(strpos($pp,'--')){
$pp=str_replace('--','-',$pp);
}
$asignar=explode('-',$pp);
if(count($asignar)!=$filas){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku no regular<br/><a href="sudoku.php" stile="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a></div>';exit;}
for($j=0;$j<count($asignar);$j++){
if(intval($asignar[$j])>$filas){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku incorrecto<br/><a href="sudoku.php" stile="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a></div>';exit;}
if(!(strpos($asignar[$j],'*')===false)){$sudoku[$i][$j]=trim($posibles);}
else{$sudoku[$i][$j]=sprintf("%'-".$digitos."s",trim($asignar[$j]));}
}
}
}
function comprobarfila($numfil){
global $sudoku;
global $filas;
global $digitos;
$contador=0;
$linea='';
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$numfil][$i])>$digitos){continue;}
if(!(strpos($linea,$sudoku[$numfil][$i])===false)){return -1;}
else{$linea.=$sudoku[$numfil][$i];$contador++;}
}
return $contador;
}
function comprobarcolumna($numcol){
global $sudoku;
global $filas;
global $digitos;
$contador=0;
$linea='';
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$i][$numcol])>$digitos){continue;}
if(!(strpos($linea,$sudoku[$i][$numcol])===false)){return -1;}
else{$linea.=$sudoku[$i][$numcol];$contador++;}
}
return $contador;
}
function comprobarsector($numsector){
global $sudoku;
global $filas;
global $digitos;
$contador=0;
$lado=floor(sqrt($filas));
$initcol=floor($numsector/$lado)*$lado;
$initfil=($numsector%$lado)*$lado;
$linea='';
for ($i=$initcol;$i<$initcol+$lado;$i++){
for ($j=$initfil;$j<$initfil+$lado;$j++){
if(strlen($sudoku[$i][$j])>$digitos){continue;}
if(!(strpos($linea,$sudoku[$i][$j])===false)){return -1;}
else{$linea.=$sudoku[$i][$j];$contador++;}
}
}
return $contador;
}
function resuelto(){
global $sudoku;
global $filas;
global $digitos;
for ($i=0;$i<$filas;$i++){
if (comprobarfila($i)<$filas){return -1;}
if (comprobarcolumna($i)<$filas){return -1;}
if (comprobarsector($i)<$filas){return -1;}
}
return 1;
}
function imposible(){
global $sudoku;
global $filas;
global $digitos;
for ($i=0;$i<$filas;$i++){
if (comprobarfila($i)<0){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku incorrecto<br/><a href="sudoku.php" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a></div>';exit;}
if (comprobarcolumna($i)<0){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku incorrecto</div><br/><a href="sudoku.php" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a>';exit;}
if (comprobarsector($i)<0){echo '<div align="center" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">Sudoku incorrecto</div><br/><a href="sudoku.php" style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 10px;color: #CC3300;">volver a intentar</a>';exit;}
}
return 1;
}
function entregarfila($fil,$col){
global $sudoku;
global $filas;
global $digitos;
$linea='';
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$fil][$i])>$digitos){continue;}
$linea.=$sudoku[$fil][$i];
}
return $linea;
}
function entregarcolumna($fil,$col){
global $sudoku;
global $filas;
global $digitos;
$linea='';
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$i][$col])>$digitos){continue;}
$linea.=$sudoku[$i][$col];
}
return $linea;
}
function entregarrestosector($fil,$col){
global $sudoku;
global $filas;
global $digitos;
$lado=floor(sqrt($filas));
$sector=floor($fil/$lado)*$lado+floor($col/$lado);
$initcol=floor($sector/$lado)*$lado;
$initfil=($sector%$lado)*$lado;
$linea='';
for ($i=$initcol;$i<$initcol+$lado;$i++){
for ($j=$initfil;$j<$initfil+$lado;$j++){
if(strlen($sudoku[$i][$j])>$digitos || $i==$fil || $j==$col){continue;}
$linea.=$sudoku[$i][$j];
}
}
return $linea;
}
function recortarfila($fil,$col){
global $sudoku;
global $filas;
global $digitos;
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$fil][$i])==$digitos){continue;}
$sudoku[$fil][$i]=trim(str_replace($sudoku[$fil][$col],'',$sudoku[$fil][$i]));
}
}
function recortarcolumna($fil,$col){
global $sudoku;
global $filas;
global $digitos;
for($i=0;$i<$filas;$i++){
if(strlen($sudoku[$i][$col])==$digitos){continue;}
$sudoku[$i][$col]=trim(str_replace($sudoku[$fil][$col],'',$sudoku[$i][$col]));
}
}
function recortarrestosector($fil,$col){
global $sudoku;
global $filas;
global $digitos;
$lado=floor(sqrt($filas));
$sector=floor($fil/$lado)*$lado+floor($col/$lado);
$initcol=floor($sector/$lado)*$lado;
$initfil=($sector%$lado)*$lado;
$linea='';
for ($i=$initcol;$i<$initcol+$lado;$i++){
for ($j=$initfil;$j<$initfil+$lado;$j++){
if(strlen($sudoku[$i][$j])==$digitos || $i==$fil || $j==$col){continue;}
$sudoku[$i][$j]=trim(str_replace($sudoku[$fil][$col],'',$sudoku[$i][$j]));
}
}
}
function recortar(){
global $sudoku;
global $filas;
global $digitos;
for($i=0;$i<$filas;$i++){
for($j=0;$j<$filas;$j++){
if(strlen($sudoku[$i][$j])>$digitos){continue;}
recortarfila($i,$j);
recortarcolumna($i,$j);
recortarrestosector($i,$j);
}
}
}
function ordenar(){
global $sudoku;
global $filas;
global $digitos;
global $back;
$linea='';
for($i=0;$i<$filas;$i++){
for($j=0;$j<$filas;$j++){
$nuevo='';
$orden='';
if(strlen($sudoku[$i][$j])==$digitos){continue;}
$linea.=entregarfila($i,$j);
$linea.=entregarcolumna($i,$j);
$linea.=entregarrestosector($i,$j);
$cant=strlen($sudoku[$i][$j]);
for($k=0;$k<$cant;$k=$k+$digitos){
$orden[substr($sudoku[$i][$j],$k,$digitos)]=substr_count($linea,substr($sudoku[$i][$j],$k,$digitos));
}
asort($orden);
$nuevo=array_keys($orden);
$sudoku[$i][$j]=$back[$i][$j]=trim(implode('',$nuevo));
}
}
}
function mostrar(){
global $inicio;
global $sudoku;
global $filas;
global $digitos;
$fin=microtime_float();
echo "<div align=\"center\" class=\"textos2\">Proceso terminado en ".($fin-$inicio)." segundos</div><br/>";
$lado=floor(sqrt($filas));
$color[0]=array('#DBDBD','#ffffff');
if(($filas%2)==0){$color[1]=array('#ffffff','#DBDBD');}else{$color[1]=array('#DBDBD','#ffffff');}
$contador=0;
echo "<table align=\"center\" border=\"2\" cellpadding=\"0\" cellspacing=\"0\" bordercolor=\"#333333\"><tr><td><table align=\"center\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\" bordercolor=\"#333333\"";
for($i=0;$i<$filas;$i++){
$contador=floor($i/$lado);
echo "<tr>";
for($j=0;$j<$filas;$j++){
$sector=floor($i/$lado)*$lado+floor($j/$lado);
$colorcuadro[$sector]=$color[$contador%2][$sector%2];
echo "<td bgcolor=\"".$colorcuadro[$sector]."\"><div align=\"center\" class='textos'>";
echo str_replace('-','',$sudoku[$i][$j]);
echo "</div></td>";
}
echo "</tr>";
}
echo "</table></td></tr></table><br/><div align=\"center\"><a href=\"sudoku.php\" class=\"textos\">Cargar nuevo Sudoku</a></div>";
}
function resolver(){
global $terminado;
global $sudoku;
global $filas;
global $digitos;
global $back;
if($terminado==1){return;}
$lado=floor(sqrt($filas));
for($i=0;$i<$filas;$i++){
for($j=0;$j<$filas;$j++){
$cant=strlen($sudoku[$i][$j]);
if($cant>$digitos){
for($k=0;$k<$cant;$k=$k+$digitos){
$sudoku[$i][$j]=substr($back[$i][$j],$k,$digitos);
if(resuelto()==1){mostrar();$terminado=1;return;}
if(comprobarfila($i)>0 && comprobarcolumna($j)>0 && comprobarsector(floor($i/$lado)*$lado+floor($j/$lado))>0){
resolver();
}
}
$sudoku[$i][$j]=$back[$i][$j];return;
}
}
}
}
?>
<html>
<head>
<title>SUDOKU</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.campoTextoBlanco {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #000000;
background-color: #FFFFFF;
height: 18px;
border: 1px solid #CBCBCB;
}
.textos {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #CC3300;
}
-->
</style>
<style type="text/css">
<!--
.textos2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #333333;
}
-->
</style>
</head>
<body bgcolor="#F7F7F7">
<?php
if(empty($_FILES['file']['name']) && !isset($_GET['procesar'])){ ?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data" name="form1">
<fieldset>
<legend><span class="textos">Ingresar un Sudoku Regular desde Archivo de texto</span>
<span class="textos">(<a href="http://www.php-hispano.net/material/sudoku/sudoku4.txt" target="_blank" class="textos">ver
formato</a>)</span></legend>
<input type="file" name="file" class="campoTextoBlanco">
<input type="submit" name="Submit" value="Enviar" class="campoTextoBlanco">
</fieldset>
</form>
<?php }
elseif(!isset($_GET['procesar'])){
move_uploaded_file($_FILES['file']['tmp_name'],'sudoku.txt');
@chmod('sudoku.txt',0755);
header('Location:'.$_SERVER['PHP_SELF'].'?procesar=1');exit;
}elseif($_GET['procesar']=='1'){
cargar();
imposible();
recortar();
ordenar();
resolver();
}else{
header('Location:'.$_SERVER['PHP_SELF']);exit;
}
?>
</body>
</html>
<?php
ob_end_flush();
?>