1. 程式人生 > >資料結構——八皇后遞迴解法

資料結構——八皇后遞迴解法

程式碼來源: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);	
}