紫气东来 | 2023-11-21 16:13:27 | 编程 | 0
php解决八皇后问题
今天去表弟家玩,他提到了八皇后摆放问题,我说直接用8个for循环镶套就可以解决,经过一番构思和测试,终于实现了输出八皇后位置。
因为每一行只能摆放一个皇后,所以我只求每个皇后的纵坐标。
代码分享如下,留下纪念下。
. for($a=1;$a<9;$a++){ $tmp[1]=$a; for($b=1;$b<9;$b++){ $tmp[2]=$b; if($b==$a){continue;} if( abs($b-$a)==1 ){continue;} for($c=1;$c<9;$c++){ $tmp[3]=$c; if (in_array($c, array($a, $b))){ continue; } if( abs($c-$b)==1||abs($c-$a)==2 ){ continue; } for($d=1;$d<9;$d++){ $tmp[4]=$d; if (in_array($d, array($a,$b,$c))){ continue; } if ( abs($d-$b)==2 ||abs($d-$a)==3 ||abs($d-$c)==1 ){ continue; } for($e=1;$e<9;$e++){ $tmp[5]=$e; if (in_array($e, array($a,$b,$c,$d))){ continue; } if ( abs($e-$b)==3 ||abs($e-$a)==4 ||abs($e-$c)==2 ||abs($e-$d)==1 ){ continue; } for($f=1;$f<9;$f++){ $tmp[6]=$f; if (in_array($f, array($a,$b,$c,$d,$e))){ continue; } if ( abs($f-$b)==4 ||abs($f-$a)==5 ||abs($f-$c)==3 ||abs($f-$d)==2 ||abs($f-$e)==1 ){ continue; } for($g=1;$g<9;$g++){ $tmp[7]=$g; if (in_array($g, array($a,$b,$c,$d,$e,$f))){ continue; } if ( abs($g-$b)==5 ||abs($g-$a)==6 ||abs($g-$c)==4 ||abs($g-$d)==3 ||abs($g-$e)==2 ||abs($g-$f)==1 ){ continue; } for($h=1;$h<9;$h++){ $tmp[8]=$h; if (in_array($h, array($a, $b,$c,$d,$e,$f,$g))){ continue; } if ( abs($h-$b)==6 ||abs($h-$a)==7 ||abs($h-$c)==5 ||abs($h-$d)==4 ||abs($h-$e)==3 ||abs($h-$f)==2 ||abs($h-$g)==1 ){ continue; } $xx[]=$tmp; } } } } } } } } print_r($xx);