数据结构——八皇后递归解法

代码来源:https://www.cnblogs.com/houkai/p/3480940.html

参考代码:(注解多为自己填写)

#include <iostream>
#include <stdlib.h> 
using namespace std;
//k为第几行,a[k]为第几列 
bool check_2 (int a[],int n)
{
    for(int i=1;i<=n-1;i++)//依次判断n行之前的皇后是否与n行皇后冲突 
    {
        if((abs(a[i]-a[n])==n-i)||(a[i]==a[n]))//对角线不相等且不在同一列 
            return false;
    }      
    return true;
}

int a[100], n, count;
void backtrack(int k)
{
    if (k>n)//当k=n+1时找到解
    {
        for(int i=1;i<=8;i++)  
        {
            //cout<<a[i];
        }
        //cout<<endl;
        count++;
    }
    else
    {
        for (int i = 1;i <=n; i++)//找不到合适的列(位置),回到上一行 
        {
            a[k] = i;  //依次寻找适合的列 
            if (check_2(a,k) == 1)//当前皇后的位置符合要求,则求下一个皇后 
            {backtrack(k+1);}  //递归调用,进入下一行(即下一个皇后) 
        }
    }
    
}

int main()
{
    n=8,count=0;
    backtrack(1);//从第一行开始 
    cout<<count<<endl;
}

某道程序填空题修改后结果:

//求解N 皇后问题
#include <stdio.h>
#include <stdlib.h>

#define N 20 //最多皇后个数
int q[N];	//存放各皇后所在的列号,即(i,q[i])为一个皇后位置
int  count  =  0;	//累计解个数
void  dispasolution(int  n)	//输出n 皇后问题的一个解
{
    printf(" 第%d 个解:", ++count);
    for(int i = 1; i <= n; i++)
        printf("(%d,%d) ", i, q[i]);
    printf("\n");
}

//i代表行,j代表列
bool place(int i, int j)	//测试(i,j)位置能否摆放皇后
{
    int k=1;
    if(i == 1)
        return  true;	//第一个皇后总是可以放置int k = 1;
    while(   k<=i-1 	)  {//1 //k=1~i-1 是已放置了皇后的行
        if((q[k] ==  j	) ||  (abs(q[k] - j))==  i-k	)//2 3
            return false;
        k++;
    }

    return true;

}
void  queen(int  i,  int  n)	//放置 1~i 的皇后
{
    if( i>n	)//4
        dispasolution(n);	//所有皇后放置结束
    else {
        for(int j =  1; j <=  n;  j++)		//在第i 行上试探每一个列j
            if(place(i,  j)) {
                //在第i 行上找到一个合适位置(i,j)
                q[i]=j	;//5
                queen(i+1, n)	;//6
            }

    }

}

int  main()

{
    int  n;	//n 为存放实际皇后个数
    printf(" 皇后问题(n<20) n=");
    scanf("%d",  &n);
    if(n > 20)
        printf("n 值太大,不能求解\n");
    else {
        printf("%d 皇后问题求解如下:\n", n);
        queen(1,  n);	//放置 1~i 的皇后
    }

}

自己参考后用c写的,但有错误,暂时还不知道为什么错

#include <stdio.h>
#include <stdlib.h>
int i,n,count,a[100];
int check(int a[],int n)
{
    for(i=1;i<=n-1;i++)
    {
        if((abs(a[n]-a[i])==n-i)||(a[n]==a[i]))
        return 0;
    }
    return 1;
}
void recursion(int k)
{
    if(k>n)
    {
        printf("111\n");
        count++;
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            a[k]=i;
            if(check(a,k)==1)
            { recursion(k+1);
                    printf("111\n");
            }
        }
    }
}
int main()
{
    n=8;
    count=0;
    printf("%d",count);		
    recursion(1); 
    printf("%d",count);	
} 
    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/qq_41856733/article/details/84201319
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞