PHP에서 Eight Queens 문제 알고리즘의 구현 단계

WBOY
풀어 주다: 2023-07-07 18:52:02
원래의
715명이 탐색했습니다.

PHP에서 8개의 여왕 문제 알고리즘을 구현하는 단계

소개:
8개의 여왕 문제는 컴퓨터 과학 분야를 괴롭히는 유명한 문제입니다. 이 문제는 8x8 체스판에 8개의 여왕을 배치하여 두 명의 여왕이 서로 상호 작용할 수 없도록 해야 합니다. 기타.공격. 이 기사에서는 PHP에서 Eight Queens 문제를 구현하는 알고리즘 단계를 제공하고 코드 예제를 첨부합니다.

1. 문제 분석
여왕 문제는 전형적인 역추적 문제라고 볼 수 있습니다. 8x8 체스판에서는 각 행에 퀸 하나만 배치할 수 있으며 각 행의 퀸은 다른 행의 퀸과 동일한 열, 행 또는 대각선에 있을 수 없습니다.

2. 알고리즘 구현 단계

  1. 체스판 초기화: 체스판으로 8x8 2차원 배열을 만들고 모든 요소를 ​​0으로 초기화하여 퀸이 현재 위치에 배치되지 않았음을 나타냅니다.
  2. 역추적 알고리즘: 첫 번째 행부터 시작하여 한 행씩 퀸을 배치해 보세요. 각 행마다 각 열에 퀸을 배치하고 공격받지 않는 조건이 충족되는지 확인하십시오. 조건이 충족되면 계속해서 재귀적으로 여왕을 다음 행에 배치합니다. 조건이 충족되지 않으면 이전 줄로 돌아가서 다른 위치에서 다시 시도하세요.
  3. 종료 조건: 모든 퀸이 체스판에 성공적으로 배치되면 해결책을 얻습니다. 솔루션 없이 모든 행을 시도하면 역추적이 종료됩니다.

3. PHP 코드 예제
다음은 PHP를 사용하여 Eight Queens 문제 알고리즘을 구현하는 코드 예제입니다.

<?php

class EightQueens {
    private $board; // 棋盘
    private $solutions; // 存放所有解的数组

    public function __construct() {
        $this->board = array_fill(0, 8, array_fill(0, 8, 0));
        $this->solutions = array();
    }

    public function solve() {
        $this->placeQueen(0);
        return $this->solutions;
    }

    private function placeQueen($row) {
        if ($row == 8) {
            $this->solutions[] = $this->board;
            return;
        }

        for ($col = 0; $col < 8; $col++) {
            if ($this->isSafe($row, $col)) {
                $this->board[$row][$col] = 1; // 放置皇后

                // 递归放置下一行的皇后
                $this->placeQueen($row + 1);

                $this->board[$row][$col] = 0; // 回溯
            }
        }
    }

    private function isSafe($row, $col) {
        // 检查当前列是否已有皇后
        for ($i = 0; $i < $row; $i++) {
            if ($this->board[$i][$col] == 1) {
                return false;
            }
        }

        // 检查左上对角线是否有皇后
        $i = $row - 1;
        $j = $col - 1;
        while ($i >= 0 && $j >= 0) {
            if ($this->board[$i][$j] == 1) {
                return false;
            }
            $i--;
            $j--;
        }

        // 检查右上对角线是否有皇后
        $i = $row - 1;
        $j = $col + 1;
        while ($i >= 0 && $j < 8) {
            if ($this->board[$i][$j] == 1) {
                return false;
            }
            $i--;
            $j++;
        }

        return true;
    }
}

// 使用示例
$eightQueens = new EightQueens();
$solutions = $eightQueens->solve();

foreach ($solutions as $solution) {
    foreach ($solution as $row) {
        echo implode(" ", $row) . "
";
    }
    echo "
";
}
로그인 후 복사

위 코드는 역추적 알고리즘을 통해 Eight Queens 문제의 솔루션을 구현합니다. 프로그램을 실행하면 조건을 충족하는 모든 솔루션이 출력됩니다. 각 솔루션은 2차원 배열로 표시되며, 여기서 1은 여왕의 위치를 ​​나타냅니다.

결론:
이 글에서는 Eight Queens Problem을 PHP로 구현하는 알고리즘 단계를 소개하고 해당 코드 예제를 첨부합니다. 이 알고리즘을 통해 우리는 8x8 체스판에 8개의 퀸을 배치하여 두 퀸이 서로 공격할 수 없도록 조건을 만족하는 모든 솔루션을 찾을 수 있습니다. 역추적 알고리즘은 Eight Queens 문제를 해결하는 일반적인 방법이며 다른 유사한 문제에서도 널리 사용됩니다.

위 내용은 PHP에서 Eight Queens 문제 알고리즘의 구현 단계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!