<?php /*     php数独求解,时间大约在1分钟 */ $nums[0] = array(0, 5, 0, 0, 1, 0, 0, 0, 9, ); $nums[1] = array(0, 1, 0, 0, 0, 0, 6, 0, 0, ); $nums[2] = array(2, 0, 0, 0, 9, 0, 0, 0, 0, ); $nums[3] = array(0, 4, 0, 0, 0, 3, 7, 0, 0, ); $nums[4] = array(0, 2, 0, 0, 0, 0, 0, 8, 0, ); $nums[5] = array(0, 0, 5, 7, 0, 0, 0, 2, 0, ); $nums[6] = array(0, 0, 0, 0, 5, 0, 0, 0, 1, ); $nums[7] = array(0, 0, 3, 0, 0, 0, 0, 4, 0, ); $nums[8] = array(9, 0, 0, 0, 8, 0, 0, 3, 0, ); findShuDu($nums); exit; function findShuDu($arr) {   $paramArray = array($arr);   //向$paramArray增加数组, 参数用引用传递   cycleArray($paramArray);   $resultArray = $paramArray[count($paramArray) - 1];   echo "\n";   showArray($arr);   echo "\n";   showArray($resultArray);   if (calcArray($resultArray))   {     //echo 'success' . "\n";   }   else   {     echo 'fail' . "\n";   } } //验证结果是否有效 function calcArray($arr) {   for($i = 0; $i < 9; $i ++)   {     $sum1 = 0;     $sum2 = 0;     for($j = 0; $j < 9; $j ++)     {       $sum1 += $arr[$i][$j];       $sum2 += $arr[$j][$i];     }     if (         $sum1 != 45 || $sum2 != 45          )     {       echo 'check fail: ' . $i . ' ' . $j . "\n";       return false;     }   }   return true; } //显示结果数组 function showArray($arrLast) {   for($i = 0; $i < 9; $i ++)   {     //echo "array(";     for($j = 0; $j < 9; $j ++)     {       echo $arrLast[$i][$j];       echo ', ';     }     echo "\n";     //echo "),\n";   } } //获取一个位置有效的可选数字的数组 function getPositionAvailArray($arr) {   $arrNew = array();   for($i = 0; $i < 9; $i ++)   {     for($j = 0; $j < 9; $j ++)     {       //不为0的位置跳过       if ($arr[$i][$j] > 0)       {         continue;       }       //可用数字       $hv = array(1, 2, 3, 4, 5, 6, 7, 8, 9);       //取消行已有数字       for($k = 0; $k < 9; $k ++)       {         $a = $arr[$i][$k];         if ($a > 0)         {           $key = array_search($a, $hv);           if (false !== $key)           {             //$key 为false时不能用unset,不然会出错             unset($hv[$key]);           }         }       }       //取消列已有数字       for($k = 0; $k < 9; $k ++)       {         $a = $arr[$k][$j];         if ($a > 0)         {           $key = array_search($a, $hv);           if (false !== $key)           {             unset($hv[$key]);           }         }       }       //取消小方块中已有数字       $otherI1 = intval($i / 3);       $otherJ1 = intval($j / 3);       $otherI = $otherI1 * 3;       $otherJ = $otherJ1 * 3;       for ($ii = $otherI; $ii 0)           {             $key = array_search($a, $hv);             if (false !== $key)             {               unset($hv[$key]);             }           }         }       }       if (empty($hv))       {         /*              echo '出现无效数字 ';              echo sprintf("行: %s列: %s\n", $i + 1, $j + 1);              showArray($arr);          */         return false;       }       $arrNew[$i][$j] = $hv;     }   }   return $arrNew; } //递归循环得到有效数组,参数用引用传递,每次得到有效数组后增加到最后 function cycleArray(&$numArray) {   //取最后一个数组   $arr = $numArray[count($numArray) - 1];   $info = getPositionAvailArray($arr);   if (false === $info)   {     return false;   }   $positionI = -1;   $positionJ = -1;   $availCountMin = 9;   //找出可选数字最少的位置   for($i = 0; $i < 9; $i ++)   {     for($j = 0; $j < 9; $j ++)     {       $availCount = count($info[$i][$j]);       if ($availCount > 0 && $availCount < $availCountMin)       {         $positionI = $i;         $positionJ = $j;         $availCountMin = $availCount;       }     }   }   if ($positionI >= 0 && $positionJ >= 0)   {     $newInfo = $info[$positionI][$positionJ];     foreach ($newInfo as $key => $value)     {       echo sprintf("[%s][%s]: %s;\t", $positionI, $positionJ, $value);       $arr[$positionI][$positionJ] = $value;       //unset的bug存在的地方, 如果用[]构建数组, 同时之前用unset取消一些元素,那么key值可能并不是按顺序递增,所以用count()得到数组元素个数来作为key值.被注释的代码是有问题的代码.       //var_dump(array_keys($numArray));       //$numArray[] = $arr;       //var_dump(array_keys($numArray));       //------------------------------       $numArray[count($numArray)] = $arr;       $ret = cycleArray($numArray);       if ($ret)       {         return true;       }       else       {         //取消最后一个数组元素         unset($numArray[count($numArray) - 1]);       }     }     return false;   }   return true; }

php 数独求解,php求解数独相关推荐

  1. java课程 数独 文库_一次数独生成及求解方案的剖析(Java实现)

    数独生成及求解方案剖析(Java实现) 关键词 数独9x9 数独生成 数独解题 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的数独这个 ...

  2. 数独问题流程图_数独游戏的难度等级分析及求解算法研究

    2 数独难度等级 数独游戏发展至今, 在数独爱好者的积极探索下, 求解数独的算法众多, 有 矩形顶点删减法.关键数删减法等 [7] .解答一道数独问题是一种或多种方法相互 结合, 为了使玩家能循环渐进 ...

  3. Python Z3约束求解器解决数独问题

    Z3是由Microsoft Research开发的高性能定理证明器.接下来将使用Python3中的Z3库来实现对数独问题的解决. 关于Python中Z3的使用入门,可以参考这篇博文https://bl ...

  4. [迭代][DFS]用C++求解传统九宫格数独

    [迭代][DFS]用C++求解传统九宫格数独 简介 流程图 部分代码解析 全局变量 函数功能描述 迭代 DFS 全部代码 测试样例 仅使用DFS的测试结果 不使用迭代的代码 组测试 无迭代 有迭代 改 ...

  5. 软件工程基础个人项目——数独终局生成求解

    目录 1.源代码的GitHub链接: 2.PSP表格(预估): 3.题目要求: 4.解题思路: 1)数独游戏规则 2)生成数独终局 2)求解数独 5.设计实现过程: 第一部分:sudoku类的构建 第 ...

  6. python大作业数独_python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

  7. (附代码)数独大作业【读取数独,解数独,生成唯一解数独(随机,特定形状,不同难度生成),玩数独】

    注:未经同意不要转载. 上学期简单的做了一个数独程序,实现了一些功能,想简单的为大家提供的思路. 为了避免某些情况出现,具体代码暂时先不发了,有不太懂的地方可以评论提问啊. 下面是我的具体报告: 一, ...

  8. linux下多线程验证数独,6.6.1 数独求解服务器

    6.6.1 数独求解服务器 假设有这么一个网络编程任务:写一个求解数独的程序(Sudoku Solver),并把它做成一个网络服务. Sudoku Solver 是我喜爱的网络编程例子,它曾经出现在& ...

  9. 数独解题思路——求解数独

    求解数独过程用到了DLX(Dancing Links)算法,算法的基础是回溯算法,主要用于解决精准覆盖问题. 回溯法及假设当前位置的数字,然后往下一个位置进行,直到进行到某一个位置时发现无论如何也找不 ...

最新文章

  1. 32个笔画顺序表图片_32个笔画掌握透了,练字真的不难
  2. freebsd用户密码文件
  3. php循环不出数据,在thinkphp模板中循环数组没有循环出所需要的数据
  4. LeetCode419罗马数字转整数python
  5. wxWidgets:wxDirTraverser类用法
  6. aws s3 獲取所有文件_AWS SA associate 证书考试学习记录-EBS,S3,EFS比较
  7. 如何在data visualization 中update svg_如何操作小程序页面中data数据区中的数据
  8. Python3高级 之 协程
  9. 部分AllWin 平台Android4.4 车机 USB兼容性
  10. python if elif else用法_python----if -- elif -- else 用法
  11. pytorch---模型加载与保存(2)
  12. 日期时间格式与时间戳互转
  13. WampServer中MySQL中文乱码解决
  14. 基于任务分析的非递归遍历二叉树
  15. vcpkg安装库时异常解决
  16. 计算机仿真 是核心吗,《计算机仿真》北大核心
  17. mysql数据库设计与优化与架构 模拟场景(京东商城)
  18. 送小情人一个深海之声蓝牙耳机,樱花粉简直美得没朋友
  19. j3455安装linux 4k驱动,nas-j3455kvm安装win10及集成显卡直通
  20. Java实现将文件(图片)上传到七牛云对象存储,并实现下载和删除功能

热门文章

  1. 向质量要增长,内容社区告别“大水漫灌”时代
  2. java的格式控制符_C语言的格式控制符
  3. Calibre 3.0 正式版发布,开源电子书管理软件
  4. char *const p ,char const *p,const char *p的区别
  5. OA系统如何实现实时项目成本核算
  6. 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
  7. #第三章 数理文化的发展3.1毕达哥拉斯
  8. 使用GeoServer发布WMS动态地图服务,使用openlayers访问wms服务浏览地图数据
  9. seq to seq
  10. 数据库仓工具箱及阿里大数据之路--阅读总结