Rumah > pembangunan bahagian belakang > tutorial php > 详解PHP如何实现数独求解

详解PHP如何实现数独求解

*文
Lepaskan: 2023-03-19 06:48:01
asal
2755 orang telah melayarinya

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

具体如下:

一、数独问题描述:

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

二、实现代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

<?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(&#39;&#39;, $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),

));

?>

Salin selepas log masuk

运行结果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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

Salin selepas log masuk

相关推荐:

关于php 数组函数的一些介绍

PHP 数组遍历foreach语法结构及实例

php 数组处理函数extract详解及实例代码

Atas ialah kandungan terperinci 详解PHP如何实现数独求解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan