闲来无事,我也写个八皇后
刚入职,有点闲,记得大学有听说过什么八皇后,没有实现过,心血来潮,打算自己写一个,写了整整一天。。。回想起大学,哎,没好好学习,原来大学的课程还是有用的,学了总比没学好,当时觉得没用的知识,不一定以后也不着,并且很有可能用得着。。。在这里奉劝一下在校大学生,把大学的专业课程好好学好,对你绝对有用的,理解下课本上的思想也行(比如说编译原理,图形学,计算机体系结构,操作系统等,这些大部分人真的可能不会参加这方面的工作,但里面的各种思想是解决各种问题的精华中的精华,不限于在程序上),还有英语及交际口才能力,也非常非常非常重要,与你职业上能达到什么高度样紧密相关。
再发下牢骚,本人从小的理想就是当天文方面的物理科学家去探索浩瀚宇宙(留给我儿子去实现吧),无奈智力有限,英语太烂等,只能上个普通本科,做只普通程序猿,毕业后进个深圳一家普通公司,做网站的,学校学的是JAVA,工作就转向了PHP,工作了3年,期间与网站有关的都做(前台样式脚本、后台PHP、服务器LINUX等),今年运气好跳到了一家很大的公司,希望自己以后会越来越好~
再发下牢骚,本人从小的理想就是当天文方面的物理科学家去探索浩瀚宇宙(留给我儿子去实现吧),无奈智力有限,英语太烂等,只能上个普通本科,做只普通程序猿,毕业后进个深圳一家普通公司,做网站的,学校学的是JAVA,工作就转向了PHP,工作了3年,期间与网站有关的都做(前台样式脚本、后台PHP、服务器LINUX等),今年运气好跳到了一家很大的公司,希望自己以后会越来越好~
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<?php
$num = 8; //几皇后?
echo showQueens(queen($num),$num);
/**
回溯主体函数,返回所有可能的方案数组
*/
function queen($num){
$queen=array(); //临时的一种方案
$queens=array();//全部方案
for($i=0;$i<$num;$i++){//从00位置开始放置皇后
for($j=0;$j<$num;$j++){
if(is_conflict($queen,$i,$j,$num)){ //有冲突则取下一个
if($j+1===$num){ //列到了再后一个都有冲突则回退
backRow($queen,$i,$j,$num);
countinue;
}
}else{ //没有冲突则前进
$queen[$i][$j]=1; //记录可行值
if($i===$num-1){ //前面到了最后一行,达成一种方案,记录。。
$queens[]=$queen;
unset($queen[$i]);
backRow($queen,$i,$j,$num);//回退
}else{
break;
}
}
}
}
return $queens;
}
function backRow(&$queen,&$i,&$j,$num){
$i=$i-1;
$j=getNextJ($queen[$i]);//求回退位置的J的下标
unset($queen[$i]);
if($j+1===$num){ //回退的行已经是最后一列了,接着回退
$i=$i-1;
if($i===-1){ //回退到了第一行,遍历结束
$i=$num;return;
}
$j=getNextJ($queen[$i]);
unset($queen[$i]);
}
}
function getNextJ($queen){
foreach($queen as $k=>$v){
return $k;
}
return false;
}
/**
显示打印结果
*/
function showQueens($queens,$num){
$html ='<div>'.$num.'皇后共'.count($queens).'种方案</div>';
foreach($queens as $queen){
$html .=showQueen($queen,$num);
}
return $html;
}
//图形显示
function showQueen($queen,$num){
$html ='<table style="text-align:center;">
<tr>';
for($i=-1;$i<$num;$i++){
$html .='<td width="52" height="52">'.$i.'</td>';
}
$html .='</tr>';
foreach($queen as $row=>$q){
$html .='<tr><td height="52">'.($row).'</td>';
for($i=0;$i<$num;$i++){
$html .='<td style="background-color:#00cc99;">'.$q[$i].'</td>';
}
$html .='</tr>';
}
$html .='</table>';
return $html;
}
/**
检查要前进i,j的位置上面有没有冲突
*/
function is_conflict($queen,$i,$j,$num){
$flag=check_conflict_col($queen,$i,$j); //竖列有没有冲突
if($flag)return $flag;
$flag=check_conflict_corner_left($queen,$i,$j); //左上对角有没有冲突
if($flag)return $flag;
$flag=check_conflict_corner_right($queen,$i,$j,$num); //右上对角有没有冲突
return $flag;
}
//竖列有冲突?
function check_conflict_col($queen,$i,$j){
for($row=0;$row<$i;$row++){
if($queen[$row][$j]===1){
return true;
}
}
return false;
}
//左上斜线有冲突?
function check_conflict_corner_left($queen,$i,$j){
$step=1;
while($i-$step>=0 && $j-$step>=0){
if($queen[$i-$step][$j-$step]===1){
return true;
}
$step++;
}
return false;
}
//右上斜线有冲突?
function check_conflict_corner_right($queen,$i,$j,$num){
$step=1;
while(($i-$step)>=0 && ($j+$step<$num)){
if($queen[$i-$step][$j+$step]===1){
return true;
}
$step++;
}
return false;
}
?>
</body>
...全文
相关推荐
八皇后扩展N皇后详细流程图
八皇后扩展N皇后详细流程图
八皇后游戏 八皇后游戏 八皇后游戏 八皇后游戏
八皇后游戏的说明: 问题的提出:八皇后是个古老而有趣的游戏,是由高斯于1850年首先提出的。 要求在国际象棋的棋盘上放置八个皇后,使其不能相互攻击,即任意两个皇后不能处于 棋盘的同一行、同一列和同一条对角线上。试问有多少种放法? 基本思想是:先把皇后放在(0,0)位置,然后把1号皇后放在(1,j)位置, 使其满足要求。接着放2号皇后,依此类推。遇到某个皇后如把她无论放在该行的任意 位置均不满足要求,则前一个皇后放置不当,须重新放置前一皇后,如8个皇后均按要 求放置好,这就是一次成功的摆法。
可视化八皇后
请编写八皇后游戏程序(要求采用图形界面):设计一个8×8的棋盘,允许用户在棋盘的格子上放置8个皇后(国际象棋中的棋子)。要求每两个皇后不能处于同一条横线,竖线和45度或135度的斜线上(即按国际象棋的规则要求任意两个皇后不能处于直接可以互相攻击的状态)。如果用户放置的棋子不符合上面要求,则程序给出错误显示,并请设计某种比较直观的方式标出可以互相攻击的两个皇后,然后要求重新放置该棋子。当8个皇后全部放在棋盘上,且任意两个皇后不能互相攻击,则显示成功的信息和所用的时间。
c++写的八皇后算法
我自己写的八皇后算法,共享一下,大家学习学习
C++写的程序《八皇后》问题
c++写的《八皇后》程序问题,解决八皇后问题的程序。


基础编程
