PHP如何实现数独求解?本文主要介绍了PHP实现的数独求解问题,涉及php数组与字符串的遍历、比较、判断、运算等相关操作技巧,需要的朋友可以参考下。希望对大家有所帮助。

具体如下:

一、数独问题描述:

对于给出的数字二维数组,要求每行每列的数字不能重复。

二、实现代码:<?php

/* 数独求解程序

*

*/

class Sudoku {

var $matrix;

function __construct($arr = null) {

if ($arr == null) {

$this->clear();

} else {

$this->matrix = $arr;

}

}

function clear() {

for($i=0; $i<9; $i++) {

for($j=0; $j<9; $j++) {

$this->matrix[$i][$j] = array();

for ($k = 1; $k <= 9; $k++) {

$this->matrix[$i][$j][$k] = $k;

}

}

}

}

function setCell($row, $col, $value){

$this->matrix[$row][$col] = array($value => $value);

//row

for($i = 0; $i < 9; $i++){

if($i != $col){

if(! $this->removeValue($row, $i, $value)) {

return false;

}

}

}

//col

for($i = 0; $i < 9; $i++){

if($i != $row){

if(! $this->removeValue($i, $col, $value)) {

return false;

}

}

}

//square

$rs=intval($row / 3) * 3;

$cs=intval($col / 3) * 3;

for($i = $rs; $i < $rs + 3; $i++){

for($j = $cs; $j < $cs + 3; $j++){

if($i != $row && $j != $col){

if(! $this->removeValue($i, $j, $value))

return false;

}

}

}

return true;

}

function removeValue($row, $col, $value) {

$count = count($this->matrix[$row][$col]);

if($count == 1){

$ret = !isset($this->matrix[$row][$col][$value]);

return $ret;

}

if (isset($this->matrix[$row][$col][$value])) {

unset($this->matrix[$row][$col][$value]);

if($count - 1 == 1) {

return $this->setCell($row, $col, current($this->matrix[$row][$col]));

}

}

return true;

}

function set($arr) {

for ($i = 0; $i < 9; $i++) {

for ($j = 0; $j < 9; $j++) {

if ($arr[$i][$j] > 0) {

$this->setCell($i, $j, $arr[$i][$j]);

}

}

}

}

function dump() {

for($i = 0; $i < 9; $i++){

for($j = 0; $j < 9; $j++){

$c = count($this->matrix[$i][$j]);

if($c == 1){

echo " ".current($this->matrix[$i][$j])." ";

} else {

echo "(".$c.")";

}

}

echo "\n";

}

echo "\n";

}

function dumpAll() {

for($i = 0; $i < 9; $i++){

for($j = 0; $j < 9; $j++){

echo implode('', $this->matrix[$i][$j]), "\t";

}

echo "\n";

}

echo "\n";

}

function calc($data) {

$this->clear();

$this->set($data);

$this->_calc();

$this->dump();

}

function _calc() {

for($i = 0; $i < 9; $i++){

for($j = 0; $j < 9; $j++){

if(count($this->matrix[$i][$j]) == 1) {

continue;

}

foreach($this->matrix[$i][$j] as $v){

$flag = false;

$t = new Sudoku($this->matrix);

if(!$t->setCell($i, $j, $v)){

continue;

}

if(!$t->_calc()){

continue;

}

$this->matrix = $t->matrix;

return true;

}

return false;

}

}

return true;

}

}

$sd=new Sudoku;

$sd->calc(array(

array(0,5,0,0,0,6,0,9,0),

array(0,4,7,0,8,2,6,0,0),

array(0,8,0,0,0,7,0,5,2),

array(7,0,1,0,3,4,0,0,6),

array(0,3,0,0,2,0,0,8,0),

array(2,0,0,0,0,1,9,0,4),

array(4,7,0,1,0,0,0,6,0),

array(0,0,9,4,6,0,3,7,0),

array(0,1,0,2,0,0,0,4,0),

));

$sd->calc(array(

array(1,0,0,0,0,6,9,0,0),

array(0,0,0,9,0,0,0,0,5),

array(2,0,0,1,0,0,0,0,3),

array(0,0,5,3,0,7,0,2,0),

array(3,0,0,6,0,0,0,0,1),

array(0,1,0,4,0,0,8,0,0),

array(9,0,0,0,0,2,0,0,7),

array(5,0,0,0,0,9,0,0,0),

array(0,0,3,7,0,0,0,0,4),

));

$sd->calc(array(

array(7,0,0,1,0,0,0,0,5),

array(0,0,6,0,4,0,0,8,0),

array(0,0,1,0,0,0,0,0,0),

array(0,6,0,0,8,0,0,0,3),

array(0,8,0,0,0,9,0,7,0),

array(1,0,0,0,0,0,0,5,0),

array(0,0,0,0,0,0,9,0,0),

array(0,4,0,0,3,0,1,0,0),

array(9,0,0,0,0,7,0,0,2),

));

$sd->calc(array(

array(0,5,0,0,0,0,0,2,0),

array(0,0,3,1,0,0,5,0,0),

array(0,0,6,0,0,8,0,0,0),

array(6,0,0,0,0,0,0,1,0),

array(8,0,0,6,0,0,0,0,4),

array(0,3,0,0,0,9,0,0,7),

array(0,0,0,5,0,0,3,0,0),

array(0,0,8,0,0,6,9,0,0),

array(0,9,0,0,0,0,0,7,0),

));

?>

运行结果如下:1 5 2 3 4 6 7 9 8

9 4 7 5 8 2 6 1 3

3 8 6 9 1 7 4 5 2

7 9 1 8 3 4 5 2 6

5 3 4 6 2 9 1 8 7

2 6 8 7 5 1 9 3 4

4 7 3 1 9 8 2 6 5

8 2 9 4 6 5 3 7 1

6 1 5 2 7 3 8 4 9

1 3 7 2 5 6 9 4 8

4 6 8 9 7 3 2 1 5

2 5 9 1 8 4 6 7 3

6 8 5 3 1 7 4 2 9

3 9 4 6 2 8 7 5 1

7 1 2 4 9 5 8 3 6

9 4 6 5 3 2 1 8 7

5 7 1 8 4 9 3 6 2

8 2 3 7 6 1 5 9 4

7 3 8 1 9 6 4 2 5

2 9 6 3 4 5 7 8 1

4 5 1 2 7 8 3 9 6

5 6 9 7 8 4 2 1 3

3 8 2 5 1 9 6 7 4

1 7 4 6 2 3 8 5 9

6 2 7 4 5 1 9 3 8

8 4 5 9 3 2 1 6 7

9 1 3 8 6 7 5 4 2

9 5 1 3 6 7 4 2 8

7 8 3 1 4 2 5 6 9

2 4 6 9 5 8 7 3 1

6 2 9 4 7 5 8 1 3

8 7 5 6 1 3 2 9 4

1 3 4 2 8 9 6 5 7

4 6 7 5 9 1 3 8 2

3 1 8 7 2 6 9 4 5

5 9 2 8 3 4 1 7 6

相关推荐:

php数独,详解PHP如何实现数独求解相关推荐

  1. ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题

    ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题 原创文章!转载需注明来源:©️ Sylvan Ding's Blog ❤️ 实验目的 了解 ADMM, ISTA, ...

  2. 原根(详解+代码实现+例题+快速求解一个数的原根)

    1.原根定义 假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1<g<P, 1<i<P,那么g可以称为是P的一个原根 简单来说,g^i mod p ≠ ...

  3. 详解Python使用模拟退火算法求解列表“最大值”

    模拟退火算法可以看作是爬山算法的一种改进,如果前方有更优解就前进,如果没有更优解就以一定概率前进.与简单的爬山算法相比,模拟退火算法有可能跳出局部而得到全局最优解,但也有可能得到更差的解,算法参数的设 ...

  4. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  5. 利用scikit中的遗传算法求解(整数01)约束规划实例详解教程+利用scipy.optimize求解约束规划问题

    注意标准形式 下面两个方法约束规划的一般标准形式为: 利用scikit-opt的遗传算法求解约束规划问题 先放上链接:scikit-opt网址 主要四个步骤: 下面依照此题多约束为例 可知该题有5个不 ...

  6. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  7. 快速幂详解(通俗易懂!)

    本文为博主原创文章,未经允许不得转载.如有问题,欢迎指正! 快速幂详解 问题背景: 粗暴求解: 如何解决超时问题: 如何解决乘法溢出的问题: AC完整代码 总结: (一)一些说明 (二)特殊情况&am ...

  8. 遗传算法(GA)详解

    遗传算法(GA)详解 遗传算法主要作用是求解最优解,例如求函数极值,或是飞机巡航问题中的最短巡航路线的求解等,其作用与模拟退火算法的作用较为相似.本文将从GA算法的原理,结构与两个实践应用进行比较详细 ...

  9. 【JY】YJK前处理参数详解及常见问题分析:二阶效应和分析求解(四)

    点击蓝字  求求关注 [写在前文] 本文介绍计算控制信息之二阶效应和分析求解. [计算信息参数详解] 三.二阶效应 A区参数详解 1.考虑P-Δ效应 这里的P-△效应指结构整体计算时是否考虑的重力二阶 ...

  10. 【算法专题】数独问题详解

    数独问题详解 1. 概述 根据百度百科的描述:数独(shù dú)是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并 ...

最新文章

  1. 011_布尔值内建函数
  2. 【图像处理】——Python实现图像特征提取BP神经网络实现图像二分类
  3. c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?
  4. Jmeter --- Http Cookie Manager
  5. 原生JavaScript(js)手把手教你写轮播图插件(banner)
  6. storm 使用外部配置文件提交拓扑
  7. 金蝶k3 与用友ncc凭证同步
  8. [转载]微软WMV9的标准化进程受阻
  9. IT项目管理 第三章
  10. 个人信用报告今起可上网查询
  11. 华为安全 HCIP722笔记
  12. 网状结构的“数据”区域
  13. 01.自我意识的觉醒
  14. Android三方依赖冲突及Gradle的exclude使用
  15. Chrome浏览器全球大翻车? 让20多亿用户无网可上
  16. Excel_VBA_编程教程(完整版)
  17. Fiddler大师之路系列(五)
  18. 七夕送给女朋友的html页面(超精美)
  19. 电商平台常用技术汇总
  20. IOS抖音短视频APP开发关于扫描二维码,并根据文本生成二维码

热门文章

  1. Murex 快速风险分析引擎
  2. 关于MSNSHELL加密MSN聊天记录问题
  3. SparkStreaming概述
  4. tas5424_TAS5414A,TAS5424A,-电子电路图,电子技术资料网站
  5. [Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析
  6. 【组合逻辑电路】——通用译码器
  7. oracle 10g、11g、 12c、19c有什么区别
  8. Flutter圆形图片
  9. 亚马逊多账号操作如何判断关联
  10. 【JavaScript】打印星型金字塔