八皇后问题

原创 2013年12月09日 22:16:46

 

分析:
对这个问题,首先我们看问题的答案,最后的结果是输出棋盘,最重要的是我们发现,最后有Queen_Max个皇后被放置好了,且每行只有一个皇后,我们很容易想到用递归解决这个问题,因为当别人帮你放好七个皇后时,你很乖就可以放好第八个,最多尝试Queen_Max次。要用递归,首先我们要想好出口,如果我们用一个数queen_number来记录已经放好的皇后的个数,不难发现,出口是当queen_number等于Queen_Max时,直接打印棋盘。要放置皇后,首先应判断,是否所选的位置能放皇后,这就要求我们写一个判断queen[x][y]是否能放皇后的函数,很容易发现这个函数中我们只要判断点(x, y)正上方,左上方,右上方三个方向是否由皇后存在,有则不能放,否则能放置。对于放置皇后的函数本人认为最难的是解决当一行都不能放置的时候,要返回上一行,而且要把上一行的皇后初始化,使要放置的位置指向原来放置皇后位置的右边,然后继续放置的问题。这一块也很难理解。
对于这一问题,因为我们使用的是递归,所以函数在调用自身时会自己保存,原来放置皇后的位置也就是下面代码的queen[x-1][i],我们要做的只是当一次调用完成时将原来放置的皇后初始化,也就是queen[x-1][i]=0,这一块我建议最好能自己调试一下,了解整个函数的过程,调试时可以把Queen_Max改成4,这样能简单一点。具体的代码如下:
 


#include<stdio.h>

#define Queen_Max 8
int queen_number=0; //表示已经放皇后的个数
int k=0;

int queen[Queen_Max][Queen_Max]; // 用二维数组表示棋盘
int judge_queen(int x, int y);
void place_queen(int x);

int main()
{
         int i, j;
         //初始化,将整个二维数组的数赋值为1
          for(i=0; i<Queen_Max; i++)
                 for(j=0; j<Queen_Max; j++)
                      queen[i][j]=0;
          place_queen(0);
         return 0;
}
//判断queen[x][y]这个点能否方皇后,能返回1,否则返回0;
int judge_queen(int x, int y)
{
        if(queen[x][y]==1)     return 0;
        int i, j;
       //检查改点上部是不是有皇后
         for(i=0; i<x; i++)
                   if(queen[i][y]==1)     return 0;
        //检查左上是否有皇后
          i=x, j=y;
          while(i>=0 && j>=0) {
                     if(queen[i--][j--]==1) return 0;
           }
//检查右上是否由皇后
           i=x, j=y;
           while(i>=0 && j<Queen_Max) {
                   if(queen[i--][j++]==1) return 0;
           }
            return 1;
}
放置皇后,完成后并打印数组,用到了递归,x表示放置的行数
void place_queen(int x)
{
         int i, j;
//出口,如果放的皇后数等于Max则打印出数组,
          if(queen_number==Queen_Max) {
                    printf("µÚ%d×é½â\n", ++k);
                     for(i=0; i<Queen_Max; i++) {
                               for(j=0; j<Queen_Max; j++) {
                                        printf("%2d", queen[i][j]);
                                 } 
                                 puts(" ");
                      }
                      puts(" ");
         }
//如果能queen[x][i]能放置,则将其赋值为1,用递归执行下一行,
          for(i=0; i<Queen_Max; i++) {
                   if(judge_queen(x, i)) {
                              queen[x][i]=1;
                              queen_number++;
                               place_queen(++x);
                             queen[x-1][i]=0; //往上返回时,要恢复数组到没有执行操作之前, 一次恢复只恢复一次, 同时记录放置皇后的数减一
                              queen_number--;
                                --x;
                   }
           }
}

 

 

 


 

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

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

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

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

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

回溯法求解八皇后问题

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

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

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

C++简单实现八皇后问题

近来无聊,想着几年前用c#实现的八皇后,是参考网上的答案,如今过了几年,想试试有没进步,用c++简单地实现。 八皇后问题,是回溯算法的经典例子,它的规则要求是同一行同一列同一条斜线不能有两个皇后,不然...
  • xanxus46
  • xanxus46
  • 2014年03月21日 16:35
  • 6707

八皇后问题(C++)

1、问题描述:在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。2、关键字:递归、上溯3、技巧:1)、经观察发现,对8 x 8的二维数组上的某点a[i][j](...
  • njnu_mjn
  • njnu_mjn
  • 2010年04月04日 10:59
  • 12924

八皇后问题的分析与解法

问题描述: 在8*8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇后,且能做到在水平方向、竖直方向和斜方向都没有冲突。请列出所有解法。 根据上述描述,我们可以得到如果两个皇后Q1(x...
  • friendbkf
  • friendbkf
  • 2015年11月17日 19:38
  • 1480

【算法复习二】八皇后问题 ---- 回溯

一,问题描述        在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。   二,分析        采用逐步试探...
  • tianshuai11
  • tianshuai11
  • 2012年05月04日 16:49
  • 7886

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

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

八皇后问题c语言算法

八皇后问题c语言算法
  • u014286076
  • u014286076
  • 2017年03月30日 20:52
  • 443
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:八皇后问题
举报原因:
原因补充:

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