php 實現八皇后問題
阿新 • • 發佈:2020-08-28
php實現的八皇后問題,可以推廣到N皇后
<?php
class
Empress{
private
$queen
;
//儲存位置,例如$queen[2] = 3表示第三行的第四列位置,行列從0計數
public
static
$count
;
//總共有多少種排列順序
private
$m
;
//規模數量
//設定幾皇后,返回排列結果
public
function
getResult(
$m
){
$this
->m =
$m
;
$this
->put(0);
}
//判斷第$n行放置位置$queen[$n] = $i 是否和前面的行衝突(同行,同列衝突,對角線衝突)
/**
* @param $n 第n行
* @return bool是否衝突
*/
private
function
attack(
$n
){
for
(
$i
=0;
$i
<
$n
;
$i
++){
if
(
$this
->queen[
$n
] ==
$this
->queen[
$i
] ||
abs
(
$this
->queen[
$n
]-
$this
->queen[
$i
]) ==
abs
(
$n
-
$i
)){
return
true;
}
}
return
false;
}
/**
*
* 列印函式
*/
private
function
show(){
for
(
$i
=0;
$i
<
$this
->m;
$i
++){
echo
$this
->queen[
$i
].
'--'
;
}
}
/**
*
* 放置第n行的位置
*/
private
function
put(
$n
){
for
(
$i
=0;
$i
<
$this
->m;
$i
++){
$this
->queen[
$n
] =
$i
;
//依次試探
$tmp_res
=
$this
->attack(
$n
);
//如果沒有衝突,要麼繼續放置下一行,要麼到最後一行了。
if
(!
$tmp_res
){
if
(
$n
==
$this
->m-1){
$this
->show();
echo
'第'
.(self::
$count
+1).
'種排列方法'
;
echo
"<br/>"
;
self::
$count
++;
}
else
{
$this
->put(
$n
+1);
}
}
}
}
}
class
Client{
public
static
function
main(){
$obj
=
new
Empress();
$obj
->getResult(4);
}
}
Client::main();
?>