八皇后问题之一

原创 2016年05月31日 22:54:53

题意:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
算法描述:
回溯法——在约束条件下先序遍历,并在遍历过程中剪去那些不满足条件的分支。
使用回溯算法求解的问题特征,求解问题要分为若干步,且每一步都有几种可能的选择,而且往往在某个选择不成功时需要回头再试另外一种选择,如果到达求解目标则每一步的选择构成了问题的解,如果回头到第一步且没有新的选择则问题求解失败。 在回溯策略中,也可以通过引入一些与问题相关的信息来加快搜索解的速度。对于皇后问题来说,由于每一行、每一列和每一个对角线,都只能放一个皇后,当一个皇后放到棋盘上后,不管它放在棋盘的什么位置,它所影响的行和列方向上的棋盘位置是固定的,因此在行、列方面没有什么信息可以利用。但在不同的位置,在对角线方向所影响的棋盘位置数则是不同的。可以想象,如果把一个皇后放在棋盘的某个位置后,它所影响的棋盘位置数少,那么给以后放皇后留下的余地就太大,找到解的可能性也大;反之留有余地就小,找到解的可能性也小。
//判断方向


  for(i=0;i<4;i++)
    {
        if(*(*(chess+i)+j)!=0)//*(chess+i)+j是第i行第j列元素的地址,*(*(chess+i)+j)是第i行第j列元素所对应的值
        {
            flag1 = 1;
            break;
        }
    }

//判断左上方


    for(i=row,k=j;i>=0&&k>=0;i--,k--)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag2 = 1;
            break;
        }
    }

//判断右下方

 for(i=row,k=j;i<4&&k<4;i++,k++)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag3 = 1;
            break;
        }
    }

//判断右上方

    for(i=row,k=j;i>=0&&k<4;i--,k++)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag4 = 1;
            break;
        }
    }

未完待续……..

版权声明:本文为博主原创文章,未经博主允许不得转载。

八皇后问题(递归回溯+迭代回溯)

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后...
  • u013351484
  • u013351484
  • 2015年04月04日 14:53
  • 562

回溯法求解八皇后问题

问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线...
  • gao1440156051
  • gao1440156051
  • 2014年03月07日 09:52
  • 7754

数据结构应用案例——栈结构用于8皇后问题的回溯求解

【说明】本文来自由周世平老师主编的《C语言程序设计》教材。我作为参编人员执笔了第7、8章。“第8章 问题求解与算法”中“8.6.1 回溯法”以8皇后问题的求解为例,介绍了回溯法的解题过程。这个解决方案...
  • sxhelijian
  • sxhelijian
  • 2015年10月05日 15:21
  • 5759

八皇后问题之一(枚举+搜索)

问题描述     会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如 何将8 个皇后放在棋盘上(有8 * 8 个方格),使它们谁也不能被吃掉!这就是著名的八皇后 问题。...
  • Smile_7x
  • Smile_7x
  • 2013年01月22日 20:07
  • 847

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单。     下面用java版的回溯算法来解决八皇后问题。     八皇后问题,是一个古老而著名的问题,是回溯算法的典型...
  • tianyaleixiaowu
  • tianyaleixiaowu
  • 2016年03月21日 12:07
  • 5517

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一...
  • u014082714
  • u014082714
  • 2015年04月06日 13:58
  • 6774

回溯法解八皇后问题及再看八皇后问题优化

1、介绍 先上张图来说明用回溯法解八皇后问题的每一步:          2、程序 看着严蔚敏的书写的,写好后运行一次性成功了,程序如下: // N皇后问题 #include...
  • tham_
  • tham_
  • 2015年01月11日 09:52
  • 1989

理解使用递归及堆栈的算法处理八皇后问题

八皇后算法
  • lnnnd
  • lnnnd
  • 2016年05月26日 15:39
  • 4084

【算法分析与设计】——八皇后问题的详解

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后...
  • theprinceofelf
  • theprinceofelf
  • 2011年08月27日 14:23
  • 11257

八皇后问题(C++)

1、问题描述:在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。2、关键字:递归、上溯3、技巧:1)、经观察发现,对8 x 8的二维数组上的某点a[i][j](...
  • njnu_mjn
  • njnu_mjn
  • 2010年04月04日 10:59
  • 12916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:八皇后问题之一
举报原因:
原因补充:

(最多只允许输入30个字)