Nクイーン(C ++)

Nクイーン - 再帰

問題

確定Nクイーン(0 <= N <= 10)、それはお互いを攻撃することができない、、Nの任意のクイーンである×Nグリッドチェスは同一行、同一列または同対角線、Q上に存在することができませんどのように多くの振り子方式。

思考

ライン当たりクイーンを配置し、各列のみクイーンを配置することができ、その後、女王が順次書き込まれ、行n列場合には、1〜n個の順列であろう。そして、彼らに正当な、有効な統計プログラムは、それぞれ配置し、配置ビュープログラムに対応し、1-Nのすべての順列を列挙することである必要があります。

バックトラッキング:いくつかの子供がどんな再帰を発行する必要がないという事実につながってきたように、境界線に到達する前に、再帰的な層では、床の上で右戻って行きます。一般的にはバックトラックと呼ばれています。

コード

#include<iostream>
using namespace std;

const int maxn=11;
int count=0,n,p[maxn];
bool hashTable[maxn]={false};

void queen(int index)
{
	if(index == n+1)
	{
		count++;
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(hashTable[i]==false)
		{
			bool flag = true;
			for(int pre=1;pre<index;pre++)
			{
				if(abs(index - pre)==abs(i-p[pre]))
				{
					flag = false;
					break;
				}
			}
			if(flag)
			{
				p[index]=i;
				hashTable[i]=true;
				queen(index+1);
				hashTable[i]=false;
			}
		}
	} 
}


int main()
{
	
	cin>>n;
	queen(1);
	cout<<count;
	return 0;
}
公開された11元の記事 ウォンの賞賛1 ビュー263

おすすめ

転載: blog.csdn.net/weixin_42408097/article/details/104398015