【USACO]エイトクイーンズチェッカーチャレンジ

【USACO]エイトクイーンズチェッカーチャレンジ

タイトル

タイトル説明

チェッカーボード6×6次、6個が存在するが、基板上に配置され、そのような各行、各列と唯一、(2本の平行線のすべての主対角線を含む)各対角線上ことほとんどのワンピースで。

ここに画像を挿入説明

上記配列は、135 246レイアウト、説明以下のようにi番目の桁は、i行目の対応する位置にピースを有する表すことができます。

行番号123 456

列番号246135

これは、ちょうどポーン配置ソリューションです。すべての作品は、溶液中に配置されている見つけるためにプログラムをコンパイルしてください。
配列および上記方法に出力して、溶液を辞書順に配置されています。
前の3つのソリューションの出力してください。最後の行は、ソリューションの合計数です。

入力形式

正の整数をNライン、ボードサイズがN×N。

出力フォーマット

最初の三つの行為の前に三つの解決策は、二つの数字各溶液間のスペースで区切られました。4行目は唯一の数、ソリューションの総数です。

サンプル入力と出力

入力#1複製
6
出力#1コピー
2 6 1 4 3 5
3 6 2 1 4 5
4 3 6 1 2 5
。4

説明/ヒント

範囲[]データ
100%、6≤n≤13ためのデータ。

NOCOWからタイトル変換。

USACOトレーニングセクション1.5

分析

問題をN-クイーン、キングは、必要な位置は、それが別の女王を持つことができない対角と右の対角を左この行、列は、です。
図ポイント(2,4)クイーン
ここに画像を挿入説明
暴力、深い検索に問題を持つ列挙タイムアウト。第1吐出ライン女王からのラインの次の位置には、)前DFS(に戻り、中間デッドエンド場合、ラインの下)はクイーンDFSを(置くことができ続けます。
私たちは、女王の位置を記録するために使用される3つの配列は、配置することができない必要があります。
[]配列嘘:女王を置く現在の行の位置を記録します。(ライ(カラムピンイン)の使用には..........
アレイRA []、それはすべての権利、この位置で右斜めクイーン(図クイーンを置く現在の位置を記録することです斜めの位置iが+ jが同じ値であるが、その後、あなたが使用できる
すべての斜めの位置)の代表者の数を。
配列[ラ]:左斜めの位置を記録するために、現在の女王を置くために、絵、この位置女王は、それが同じ値である-j私は、あなたが使用できるすべての左斜めの位置だ
すべての斜め位置)(の代表者の数を。ここで注意:ijは時々否定され、配列のラベルがあること、否定的ではありません行うにはどのように、私たちはの配列置くことができる
2倍のオープンを、直接IJ + nは、nが基板の大きさである。このなくす問題)

ここでは、我々はまた、女王の各トピックの場所を記録し、それが保管場所の配列よりも多くを必要とします。

コード

#include<iostream>

using namespace std;

int n;
int a[15];   //记录位置 
int ans =0;
bool ra[20];   //右斜 
bool la[50];   //左斜
bool lie[50];	//列 


void dfs(int x){
	if(x > n){
		ans ++;
		
		if(ans <= 3){
		
			for(int i=1;i<=n;i++){
				if(a[i]){
					cout<<a[i]<<" "; 
				}
			}
			cout<<endl;
		}

		
		return ;
	}
	
	for(int i=1;i<=n;i++){
		if(!la[x-i +n] && !ra[x+i] && !lie[i]){
			lie[i] = 1;
			la[x-i+n] = 1;
			ra[x+i] = 1;
			
			a[x] = i;
			dfs(x+1);
			lie[i] = 0;
			la[x-i+n] = 0;
			ra[x+i] = 0; 
		}
	} 
	
}

int main(){
	cin>>n;
	
	dfs(1);
		
	cout<<ans<<endl ;
	return 0;
} 
公開された75元の記事 ウォンの賞賛1 ビュー3650

おすすめ

転載: blog.csdn.net/A793488316/article/details/104623652