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

代码来源: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);	
} 

猜你喜欢

转载自blog.csdn.net/qq_41856733/article/details/84201319
今日推荐