#1 (permalink)  
Old 22-05-2008, 09:35 AM
Lucky_Star's Avatar
Senior Member
 
Tham gia ngày: May 2008
Bài gởi: 506
Credits: 182
Thanks: 0
Thanked 1 Time in 1 Post
Lucky_Star is on a distinguished road
Default [PHP]Giải quyết bài SUDOKU sử dụng PHP

Dưới đây là các hàm xử lý giải quyết bài toán SUDOKU
Sau khi thêm giao diện để người dùng nhập dữ liệu đầu vào (input) ta có một trang ví dụ: http://www.g8soft.com/~anhtt/antiquizland.php

(Thank to Anhtt nhé ^_^)
<?php
// Đặt thời gian chạy tối đa là 300s
set_time_limit(300);

define(MAX,9); // điền các số từ 1..9
define(NUM,3); // kích thước ô vuông nhỏ 9=3×3

$found = false; // đã tìm thấy kết quả hay chưa?

$R = array(); // mảng lưu trữ kết quả điền được

/**
section: MAIN PROGRAM
**/

/**
section: FUNCTIONS
**/

// Functions

function sudoku_run() {


global $R, $found;
// Input - nhập dữ liệu
/* == có thể nhập từ FORM ==
for ($i = 0; $i < MAX; ++$i) {
$R[$i] = array();
for ($j = 0; $j < MAX; ++$j) {
$R[$i][$j] = fnumber($form_values[’SUDOKU_CELL_’.$i.’_’.$j]);
}
}
*/
// Process - xử lý duyệt
_sudoku_scan(0);

// Output - in kết quả
return _sudoku_output();
}

// Functions
function _sudoku_scan($n) {
global $R, $found;
$i = floor($n / MAX);
$j = $n % MAX;

if ($n >= MAX*MAX) {
$found = true;
//output();
return;
}

if ($R[$i][$j] > 0) {
_sudoku_scan($n+1);
return;
}

for ($k = 1; $k <= MAX; ++$k) {
if (_sudoku_canput($k, $i, $j)) {
$R[$i][$j] = $k;
_sudoku_scan($n+1);
if ($found && !$print_all) return;
$R[$i][$j] = 0;
}
}
}

function _sudoku_output() {
global $R, $found;
// — In ra kết quả
}

function _sudoku_canput($k, $i, $j) {
global $R, $found;
$ii = floor($i / 3) * 3;
$jj = floor($j / 3) * 3;
$good = true;
for ($p = 0; $p < MAX; ++$p) { // hang ngang, doc
if ($R[$i][$p] == $k) { // neu da co x tai o nao do
$good = false;
break;
}
if ($R[$p][$j] == $k) {
$good = false;
break;
}
if ($R[$ii+($p/3)][$jj+($p%3)] == $k) {
$good = false;
break;
}
}
return $good;
}

?>
Trả Lời Với Trích Dẫn
Trả lời


Ðang đọc: 1 (0 thành viên và 1 khách)
 
Ðiều Chỉnh
Xếp Bài

Chuyển đến


Múi giờ GMT. Hiện tại là 05:40 PM.


Connect