全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

本文实例讲述了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数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php程序设计算法总结》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。


# PHP  # 数独求解  # 问题  # Java实现解数独的小程序  # JavaScript遍历求解数独问题的主要思路小结  # python实现数独算法实例  # Go语言实现的最简单数独解法  # c++递归解数独方法示例  # JQuery开发的数独游戏代码  # PHP实现的方程求解示例分析  # PHP经典算法集锦【经典收藏】  # php编写的抽奖程序中奖概率算法  # php 大数据量及海量数据处理算法总结  # 适用于抽奖程序、随机广告的PHP概率算法实例  # php中最简单的字符串匹配算法  # php数字转汉字代码(算法)  # 数独  # 程序设计  # 操作技巧  # 相关内容  # 遍历  # 感兴趣  # 数据结构  # 给大家  # 更多关于  # 所述  # 讲述了  # matrix  # function  # __construct  # Sudoku  # var  # arr  # array  # setCell  # row 


相关文章: 北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  装修招标网站设计制作流程,装修招标流程?  香港服务器部署网站为何提示未备案?  建站之星导航如何优化提升用户体验?  自助网站制作软件,个人如何自助建网站?  如何配置IIS站点权限与局域网访问?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何获取上海专业网站定制建站电话?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  广州美橙建站如何快速搭建多端合一网站?  如何确保西部建站助手FTP传输的安全性?  制作门户网站的参考文献在哪,小说网站怎么建立?  购物网站制作公司有哪些,哪个购物网站比较好?  如何快速搭建高效可靠的建站解决方案?  如何通过虚拟机搭建网站?详细步骤解析  已有域名建站全流程解析:网站搭建步骤与建站工具选择  建站之星如何开启自定义404页面避免用户流失?  如何在云虚拟主机上快速搭建个人网站?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何使用Golang安装API文档生成工具_快速生成接口文档  已有域名能否直接搭建网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  python的本地网站制作,如何创建本地站点?  如何在景安服务器上快速搭建个人网站?  建站主机选哪种环境更利于SEO优化?  深圳网站制作平台,深圳市做网站好的公司有哪些?  宿州网站制作公司兴策,安徽省低保查询网站?  西安大型网站制作公司,西安招聘网站最好的是哪个?  在线制作视频网站免费,都有哪些好的动漫网站?  如何有效防御Web建站篡改攻击?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  建站之星收费标准详解:套餐费用及年费价格表一览  建站之星下载版如何获取与安装?  制作网站外包平台,自动化接单网站有哪些?  如何快速打造个性化非模板自助建站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何基于云服务器快速搭建个人网站?  建站之星×万网:智能建站系统+自助建站平台一键生成  建站之星后台密码遗忘或太弱?如何重置与强化?  名字制作网站免费,所有小说网站的名字?  如何在IIS中新建站点并配置端口与物理路径?  如何基于云服务器快速搭建网站及云盘系统?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星安装后界面空白如何解决? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。