php 数独求解,php求解数独
<?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求解数独相关推荐
- java课程 数独 文库_一次数独生成及求解方案的剖析(Java实现)
数独生成及求解方案剖析(Java实现) 关键词 数独9x9 数独生成 数独解题 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的数独这个 ...
- 数独问题流程图_数独游戏的难度等级分析及求解算法研究
2 数独难度等级 数独游戏发展至今, 在数独爱好者的积极探索下, 求解数独的算法众多, 有 矩形顶点删减法.关键数删减法等 [7] .解答一道数独问题是一种或多种方法相互 结合, 为了使玩家能循环渐进 ...
- Python Z3约束求解器解决数独问题
Z3是由Microsoft Research开发的高性能定理证明器.接下来将使用Python3中的Z3库来实现对数独问题的解决. 关于Python中Z3的使用入门,可以参考这篇博文https://bl ...
- [迭代][DFS]用C++求解传统九宫格数独
[迭代][DFS]用C++求解传统九宫格数独 简介 流程图 部分代码解析 全局变量 函数功能描述 迭代 DFS 全部代码 测试样例 仅使用DFS的测试结果 不使用迭代的代码 组测试 无迭代 有迭代 改 ...
- 软件工程基础个人项目——数独终局生成求解
目录 1.源代码的GitHub链接: 2.PSP表格(预估): 3.题目要求: 4.解题思路: 1)数独游戏规则 2)生成数独终局 2)求解数独 5.设计实现过程: 第一部分:sudoku类的构建 第 ...
- python大作业数独_python做一个数独小游戏
最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...
- (附代码)数独大作业【读取数独,解数独,生成唯一解数独(随机,特定形状,不同难度生成),玩数独】
注:未经同意不要转载. 上学期简单的做了一个数独程序,实现了一些功能,想简单的为大家提供的思路. 为了避免某些情况出现,具体代码暂时先不发了,有不太懂的地方可以评论提问啊. 下面是我的具体报告: 一, ...
- linux下多线程验证数独,6.6.1 数独求解服务器
6.6.1 数独求解服务器 假设有这么一个网络编程任务:写一个求解数独的程序(Sudoku Solver),并把它做成一个网络服务. Sudoku Solver 是我喜爱的网络编程例子,它曾经出现在& ...
- 数独解题思路——求解数独
求解数独过程用到了DLX(Dancing Links)算法,算法的基础是回溯算法,主要用于解决精准覆盖问题. 回溯法及假设当前位置的数字,然后往下一个位置进行,直到进行到某一个位置时发现无论如何也找不 ...
最新文章
- 32个笔画顺序表图片_32个笔画掌握透了,练字真的不难
- freebsd用户密码文件
- php循环不出数据,在thinkphp模板中循环数组没有循环出所需要的数据
- LeetCode419罗马数字转整数python
- wxWidgets:wxDirTraverser类用法
- aws s3 獲取所有文件_AWS SA associate 证书考试学习记录-EBS,S3,EFS比较
- 如何在data visualization 中update svg_如何操作小程序页面中data数据区中的数据
- Python3高级 之 协程
- 部分AllWin 平台Android4.4 车机 USB兼容性
- python if elif else用法_python----if -- elif -- else 用法
- pytorch---模型加载与保存(2)
- 日期时间格式与时间戳互转
- WampServer中MySQL中文乱码解决
- 基于任务分析的非递归遍历二叉树
- vcpkg安装库时异常解决
- 计算机仿真 是核心吗,《计算机仿真》北大核心
- mysql数据库设计与优化与架构 模拟场景(京东商城)
- 送小情人一个深海之声蓝牙耳机,樱花粉简直美得没朋友
- j3455安装linux 4k驱动,nas-j3455kvm安装win10及集成显卡直通
- Java实现将文件(图片)上传到七牛云对象存储,并实现下载和删除功能
热门文章
- 向质量要增长,内容社区告别“大水漫灌”时代
- java的格式控制符_C语言的格式控制符
- Calibre 3.0 正式版发布,开源电子书管理软件
- char *const p ,char const *p,const char *p的区别
- OA系统如何实现实时项目成本核算
- 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
- #第三章 数理文化的发展3.1毕达哥拉斯
- 使用GeoServer发布WMS动态地图服务,使用openlayers访问wms服务浏览地图数据
- seq to seq
- 数据库仓工具箱及阿里大数据之路--阅读总结