クイーンズ2Nブルーブリッジカップの基本的な演習

クイーンズ2Nブルーブリッジカップの基本的な演習

問題の説明
  のn * nはボードを考えるには、ボードには、女王のいくつかの位置に置くことはできません。今までブラックボードが配置され、N及びN-クイーンホワイト女王ので、任意の2つの黒いクイーンが同じ行、同じ列または同じ対角線上にないことではなく、同じ列内の任意の2つの白の女王、同じ列や同じ対角線。Q. Aは、どのように多くのプット法の合計しますか?nは8以下です。
入力形式の
  入力は、第整数n、ボードのサイズが作用します。
  クイーンことができない放電に対応する位置を示す、0の整数である場合、続いてN行の各行nは0又は1の整数であり、クイーンに対応する位置を示す1の整数である場合、配置することができます。
出力フォーマット
  出力は、種の総数を表す整数は、法律を置きます。
サンプル入力:

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

サンプル出力:
2

サンプル入力:

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

出力例:
0

ソリューションの概要
この問題の解決策、問題をnは、クイーンズ理解する必要の前に、参照は以下のブログも
Nクイーンを
次の質問は、主要なアイデアを説明
の主な違いを、nおよび2nの女王クイーン問題は、それが2nのクイーン問題で、ある、それが必要です前記配置した後、とき女王1色記録女王の配置、および他の色を入れてはバイパス位置に配置されています。
Iは、深さ優先探索方法、最初の女王黒表示を使用して、表示位置を記録訪問[I] [J]黒い女王に配置される(I、Jは、クロス縦座標である)アレイが1に設定されています抜き取ら、のみに置かれたときにことを保証するために、白の女王、同じ原理を置く起動訪問[I] [J]から == 0をすることができます。
次のように特定のコード

コード(C ++)

#include<iostream>
#include<cmath>
#define maxsize 8
using namespace std;
int n;
int num=0;//输出结果 符合条件的摆法
int res_b[maxsize]; //符合条件的黑皇后摆放序列
int res_w[maxsize];//符合条件的白皇后摆放序列
int map[maxsize][maxsize]; 
int visit[maxsize][maxsize];//记录
int dfs_white(int step);
int dfs_black(int step);
bool check_b(int step);
bool check_w(int step);
int main()
{
	cin>>n;

	for(int i=0;i<n;i++)
	  for(int j=0;j<n;j++)
	  {
	  	cin>>map[i][j];
	  	visit[i][j]=0;
	  }
	dfs_black(1); 
	cout<<num; 
	return 0;
	
}
int dfs_white(int step)
{
 if(step==n+1)//白皇后全部摆放完成
  {
  	num++;
  }	
  for(int i=0;i<n;i++)
  {
  	if(!map[i][step-1]||visit[i][step-1]==1) //是否能存放皇后 
  	continue;
  	res_w[step-1]=i;
	if(check_w(step))
	{
		visit[i][step-1]=1;
		dfs_white(step+1);
		visit[i][step-1]=0;
	}
  	
  }	
}
int dfs_black(int step)
{
  if(step==n+1)
  {
  	dfs_white(1);//黑皇后全部摆放完成,开始统计白皇后
  }	
  for(int i=0;i<n;i++)
  {
  	if(!map[i][step-1]) //是否能存放皇后 
  	continue;
  	res_b[step-1]=i;
	if(check_b(step))
	{
		visit[i][step-1]=1;
		dfs_black(step+1);
		visit[i][step-1]=0;
	}
  	
  }
}

bool check_b(int step)
{
	for(int i=0;i<step-1;i++)
	{
		if(res_b[i]==res_b[step-1]||abs(step-1-i)==abs(res_b[step-1]-res_b[i])) //保证摆放的位置之前没有出现过 和不在对角线上
		return false;
	}
	return true;
}
bool check_w(int step)
{
	for(int i=0;i<step-1;i++)
	{
		if(res_w[i]==res_w[step-1]||abs(step-1-i)==abs(res_w[step-1]-res_w[i]))//保证摆放的位置之前没有出现过 和不在对角线上
		return false;
	}
	return true;
}

(OJのブルーブリッジカップでピット、6点目はありませんが、私は2406によって、私の出力は右である持っている)
問題がある、ちょうどブログを書き始めてくださいアドバイス

リリース8元の記事 ウォンの賞賛0 ビュー709

おすすめ

転載: blog.csdn.net/Daturasee/article/details/104784543