Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?
13 usuarios Online (0)
Darse de alta en la web | Recuperar password   
Inicio / Desafios / Sudoku / Solucion de panino

Desafío Sudoku

#3 Solución de panino

Código de la Solución Ver código | Comentarios Ver comentarios (1) | Descargar 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 PuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuació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
();
?>

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster