经典算法(1)——8皇后问题求解(回溯法)

本博客( http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! 
                                     
                           

问题描述:

                                          
八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。
                           

要求:

                             
编一个程序求出该问题的所有解。
                            

算法思想:

                            
回溯法
                            
使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。
该问题也可扩展到N后问题求解,只需修改程序main函数中的n值即可。
                            

代码如下:

 
/************************************************************************
 *  n后问题求解
 ***********************************************************************
*/


#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< math.h >
#include 
< conio.h >

#define  MAXNUMBER 20

// 判断当前得到的解向量是否满足问题的解
bool  place_queen( int  x[], int  k)
{
    
int i;
    
for(i=1;i<k;i++)
    
{
        
if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k)))
            
return false;
    }


    
return true;
}


// 将结果简单信息打印到屏幕
void  output_queens( int  x[], int  n)
{
    
for(int i=1;i<=n;i++)
        printf(
"%3d",x[i]);

    printf(
" ");
}


// 将结果详细信息写入文件
void  output_queens(FILE  * fp, int  number, int  x[], int  n)
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值