PHP实现的数独求解问题示例


Posted in PHP onApril 18, 2017

本文实例讲述了PHP实现的数独求解问题。分享给大家供大家参考,具体如下:

一、数独问题描述:

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

二、实现代码:

<?php
/* 数独求解程序
 * Created on 2017-4-18
 *
 */
 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 相关文章推荐
PHP 日志缩略名的创建函数代码
May 26 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php接口技术实例详解
Dec 07 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP保留两位小数的几种方法
Jul 24 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 #PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 #PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 #PHP
PHP递归删除多维数组中的某个值
Apr 17 #PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 #PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 #PHP
PHP中快速生成随机密码的几种方式
Apr 17 #PHP
You might like
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
一道输出判断型Java面试题
2014/10/01 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
中式结婚主持词
2014/03/14 职场文书
校庆接待方案
2014/03/18 职场文书
少儿节目主持串词
2014/04/02 职场文书
刊首寄语大全
2014/04/11 职场文书
劳资协议书范本
2014/04/23 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
检察院起诉书
2015/05/20 职场文书
大学运动会通讯稿
2015/07/18 职场文书