クイーンズ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によって、私の出力は右である持っている)
問題がある、ちょうどブログを書き始めてくださいアドバイス