1. <?php
    2. class Solution {
    3. private $ret;
    4. /**
    5. * @param Integer $n
    6. * @return String[][]
    7. */
    8. public function solveNQueens($n) {
    9. $this->dp($n);
    10. return $this->ret;
    11. }
    12. public function dp($n, $arr = [], $ii = 0, $jj = 0) {
    13. if (count($arr) == $n) {
    14. $this->ret[] = $arr;
    15. return;
    16. }
    17. for ($i = $ii; $i < $n; $i++) {
    18. for ($j = $jj; $j < $n; $j++) {
    19. if (!$this->isConflict($arr, $i, $j)) {
    20. continue;
    21. }
    22. $arr[$i][$j] = 1;
    23. $this->dp($n, $arr, $i + 1, 0);
    24. unset($arr[$i]);
    25. }
    26. }
    27. return;
    28. }
    29. /**
    30. * 判断加入 [$i , $j] 元素后是否还满足N皇后规则
    31. * @param $arr
    32. * @param $i
    33. * @param $j
    34. * @return bool
    35. */
    36. private function isConflict($arr, $i, $j) {
    37. // 检查横向
    38. if (isset($arr[$i])) {
    39. return false;
    40. }
    41. foreach ($arr as $k1 => $v1) {
    42. // 检查竖向
    43. if (isset($v1[$j])) {
    44. return false;
    45. }
    46. foreach ($v1 as $k2 => $v2) {
    47. // 左上,右上,左下,右下
    48. if ($i - $k1 == $j - $k2 || $i - $k1 == $k2 - $j || $k1 - $i == $j - $k2 || $k1 - $i == $k2 - $j) {
    49. return false;
    50. }
    51. }
    52. }
    53. return true;
    54. }
    55. /**
    56. * 格式化打印
    57. * @param $arr
    58. * @return string
    59. */
    60. public function pt($arr) {
    61. $ret = '';
    62. if (!$arr) return "[][]";
    63. foreach ($arr as $k1 => $v1) {
    64. foreach ($v1 as $k2 => $v2) {
    65. $ret = $ret ? $ret . "\t": $ret;
    66. $ret = $ret . "[$k1][$k2] = $v2";
    67. }
    68. }
    69. return "[$ret]";
    70. }
    71. }
    72. $n = 10;
    73. $cls = new Solution();
    74. $r = $cls->solveNQueens($n);
    75. array_walk($r, function (&$v) use ($cls) {
    76. $v = $cls->pt($v);
    77. });
    78. print_r($r);