<?php
set_time_limit(500);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Sudoku solver</title>
</head>
<body>
<h3>- jean caffou</h1>
<form id="form1" name="form1" method="post" action="">
<label>
<textarea name="grid" id="grid" cols="20" rows="12"><?
if(isset($_POST['grid'])) echo $_POST['grid']; else { ?>0 9 0 3 0 0 0 0 0
4 0 8 1 0 0 6 7 5
1 0 6 8 0 0 0 0 0
6 0 3 0 0 0 0 5 0
2 0 0 0 1 0 0 0 9
0 7 0 0 0 0 2 0 6
0 0 0 0 0 2 1 0 8
8 2 9 0 0 1 5 0 4
0 0 0 0 0 3 0 9 0<? } ?></textarea>
</label>
<label> <br />
Vnesi ?tevke od 1-9 v ?tevilsko mre?o. Kjer je mesto prazno, vnesi 0.<br />
<input type="submit" name="button" id="button" value="Re?i" />
</label>
</form>
<?php
$grid=array(array());
$solvable = false;
//////////////////////////////////////////////////////////////////////
if(isset($_POST['grid'])) {
$str=$_POST['grid'];
$elements=split("[\n\r\t ]+",$str);
//elements must containt 81 numeric values
$x=0;
$y=0;
if(count($elements)!=81) { echo "<center><h1>Neveljavna matrika"; exit; }
for($i=1;$i<=81;$i++) {
$val=$elements[$i-1];
$grid[$y][$x]=$val;
if(!($val>=0&&$val<=9)) { echo "<center><h1>Neveljavna matrika"; exit; }
$x++;
if($x==9) {
$x=0;
$y++;
}
}
$orig=$grid;
if(solve(0,0)) disp();
if(!$solvable) echo "<h1>Ni re?itev.";
}
function solve($y,$x) {
global $grid,$solvable;
if($x==9) {
$y++;
$x=0;
if($y==9) {
$solvable=true;
return true;
}
}
if($grid[$y][$x]!=0) { //this position is already solved
return solve($y,$x+1);
}
for($n=1;$n<=9;$n++) {
if(ok($y,$x,$n)) {
$grid[$y][$x]=$n;
if(solve($y,$x+1)) {
disp();
$solvable=true;
}
}
}
$grid[$y][$x]=0;
return false;
}
function ok($y,$x,$n) {
global $grid;
for($i=0;$i<9;$i++) { //row
if($grid[$y][$i]==$n) return false;
if($grid[$i][$x]==$n) return false;
}
$r=floor($y/3)*3;
$c=floor($x/3)*3;
for($a=$r;$a<$r+3;$a++)
for($b=$c;$b<$c+3;$b++)
if($grid[$a][$b]==$n) return false;
return true;
}
function disp() {
global $grid,$orig;
echo "<p><table border=\"2\">";
for($y=0;$y<9;$y++) {
echo "<tr>";
if(($y+1)%3==1&&$y>2) echo "<tr></tr>";
for($x=0;$x<9;$x++) {
$v=$grid[$y][$x];
$s="";
if($orig[$y][$x]!=$grid[$y][$x]) $s="<font color=red>";
echo "<td><strong>$s $v </td>";
if(($x+1)%3==0&&$x<8) echo "<td> </td>";
}
echo "</tr>";
}
echo "</table></p><br>";
}
?>
</body>
</html>
Sep 19, 2008
PHP: sudoku solver
This was also my assignment in college, allthough in Java, but I like it better in PHP.
You can see this script live on http://www.kafol.net/sudoku.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment