递归实现n皇后问题

a数组代表列冲突,从a[0]~a[7]代表第0列到第7列。如果某列上已经有皇后,则为1,否则为0。

数组b代表主对角线冲突,为b[i-j+7],即从b[0]~b[14]。如果某条主对角线上已经有皇后,则为1,否则为0。

数组c代表从对角线冲突,为c[i+j],即从c[0]~c[14]。如果某条从对角线上已经有皇后,则为1,否则为0。

#include <stdio.h>
static char Queen[8][8];
static int a[8];
static int b[15];
static int c[15];
static int iQueenNum=0; //记录总的棋盘状态数
void qu(int i);     //参数i代表行
int main()
{
 int iLine,iColumn;
 //棋盘初始化,空格为*,放置皇后的地方为@
 for(iLine=0;iLine<8;iLine++)
 {
    a[iLine]=0; //列标记初始化,表示无列冲突
    for(iColumn=0;iColumn<8;iColumn++)
      Queen[iLine][iColumn]='*';
 }
//主、从对角线标记初始化,表示没有冲突
 for(iLine=0;iLine<15;iLine++)
    b[iLine]=c[iLine]=0;
    qu(0);
 return 0;

}

void qu(int i)
{
 int iColumn;
 for(iColumn=0;iColumn<8;iColumn++)
 {
    if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0)
    //如果无冲突

    {

      Queen[i][iColumn]='@'; //放皇后

      a[iColumn]=1;           //标记,下一次该列上不能放皇后

      b[i-iColumn+7]=1;       //标记,下一次该主对角线上不能放皇后

      c[i+iColumn]=1;             //标记,下一次该从对角线上不能放皇后

      if(i<7) qu(i+1);        //如果行还没有遍历完,进入下一行

      else //否则输出

      {

        //输出棋盘状态

        int iLine,iColumn;

        printf("第%d种状态为:\n",++iQueenNum);

        for(iLine=0;iLine<8;iLine++)

        {

          for(iColumn=0;iColumn<8;iColumn++)

            printf("%c ",Queen[iLine][iColumn]);

          printf("\n");

        }

        printf("\n\n");

      }

      //如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置

      Queen[i][iColumn]='*';

      a[iColumn]=0;

      b[i-iColumn+7]=0;

      c[i+iColumn]=0;

    }

 }
}
时间: 2024-10-26 00:05:02

递归实现n皇后问题的相关文章

python基于右递归解决八皇后问题的方法

  本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=que

c++递归实现n皇后问题代码(八皇后问题)_C 语言

还是先来看看最基础的8皇后问题: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 扩展到N皇后问题是一样的.一看,似乎要用到二维数组.其实不需要.一维数组就能判断,比如Arr[i],就可以表示一个元素位于第i行第Arr[i]列--应用广泛的小技巧.而且在这里我们不用考虑去存储整个矩阵,如果Arr[i]存在,那么我们在打印的时候,打印到皇后位置的时候输出1,非皇后位输出0即可. 这种思路的实现方式网上大把,包括前面提到的那

c语言-C语言递归的数字转换问题,习题求解

问题描述 C语言递归的数字转换问题,习题求解 C语言使用递归算法将一个正整数字符串为对应的数值.不得使用循环 解决方案 c语言没有默认参数吧,改为: #include <stdio.h> int fun(char *p,int m) { int n=1; if(*p) { n=m*10+*p-'0'; return fun(p+1,n); } return m; } void main() { char str[]="1234"; printf("%d "

c语言-C语言递归的内存释放问题

问题描述 C语言递归的内存释放问题 我用C语言实现alpha-beta极小极大算法来做一个棋类游戏的AI,博弈树是用递归的方式构造的,然后发现AI每下一步程序的内存都在增大,原来是因为递归没有释放内存. 耗内存的指针是棋盘 char ** chessboard; 于是我在递归函数的每一个return之前都把 chessboard 给释放了,发现内存还是一直在涨,求解.. 解决方案 把递归函数实现贴出来. 解决方案二: 估计释放的不全.二级指针要分两级释放. 解决方案三: 二级指针的释放是要分两步

在matlab中solve求解问题

问题描述 在matlab中solve求解问题 solve('XFDY= -xg1.*sin(wa1)+yg1.*cos(wa1)',' YFDY=xg1.*cos(wa1)+yg1.*sin(wa1)',' XFDY= 50.55*cos(u)','YFDY=50.55*sin(u)',u); 在上式中u为参数变量,wa1等于一个值,XFDY,YFDY为变量,xg1,yg1为关于u的变量,之前有公式表达.但出现以下错误: 错误使用 solve>processString (line 365) '

求班主求帮助android问题

问题描述 求班主求帮助android问题 Android的官方api里怎么没有android.support.v4这个包啊 解决方案 非递归求N皇后问题 解决方案二: eclipse还是AS?都有的啊 解决方案三: http://www.cnblogs.com/yejiurui/p/3448954.html 解决方案四: 管他有没有 下个不就得了

皇后问题之C#版(非递归)

递归|问题   /* *Author:Junyi Sun @CCNU* E-mail:fxsjy@yahoo.com.cn*/ using System;namespace sunjoy{    public class Queen    {        public static int Main()        {            int board_size = 0,x=0,y=0;//棋盘大小,当前行,当前列            uint solution_count = 0

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

八皇后问题的递归求解

八皇后问题的递归算法 #include <stdio.h>#include <stdlib.h>#define N 8        /* 棋盘边长  */#define XXN     15 /* 正(反)对角线个数 */#define TRUE 1#define FALSE 0 int map[N][N];/* 棋盘     */ int col[N];   /* 列       */int XX[XXN];  /* 正对角线 */int YY[XXN];  /* 反对角线 *