詳細なエイトクイーンの配置の問題

元の質問はLuoguP1219にあります。
質問は
、次のように6 \ times 66×6のチェッカーボードについて説明しています。ボードには6つのチェスの駒が配置されているため、各行と各列には1つだけ、各対角線があります。 (2つの主対角線のすべての平行線上に最大で1つのピースがあることを含む

ここに画像の説明を挿入
上記のレイアウトは、シーケンス2 4 6 1 3 5で記述できます。i番目の番号は、次のように、i番目の行の対応する位置にポーンがあることを示します。

行番号12 3 4 5 6

列番号24 6 1 3 5

これは、ピースを配置するための単なる解決策です。すべてのチェスの駒の解決策を見つけるためのプログラムを作成してください。
そして、上記のシーケンス方式で出力すると、辞書式順序で解が配置されます。
最初の3つのソリューションを出力してください。最後の行は、ソリューションの総数です。

入力形式
1行に1つの正の整数nは、チェス盤のサイズがm×nであることを示します。

出力形式
最初の3行は最初の3つのソリューションであり、各ソリューションの2つの数値はスペースで区切られています。4行目には、ソリューションの総数を示す1つの数字しかありません。
入力および出力サンプル
入力
6
出力
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
次の質問は、私が理解略です。
ここに画像の説明を挿入

// Oは女王Xを配置できない位置です。
最初の行(i)と4番目の列(k)が女王であるとすると、女王は水平方向と垂直方向に配置できません。左上からの対角線右下と右上から左下への対角線も
コアコードを




配置できませんif(!lie [k] &&!left1 [k + x] &&!right1 [x-k + n])line、一度に複雑さを軽減できます。画像を見るを見つけることができます。i+ kは左上から右下への対角線を見つけることができます。同様に、xkは同じですが、xkは範囲外である可能性があるため、nを追加します。行としてdfs(x)を使用します。
以下のコードを参照してください
#include
using namespace std;

#40intの
部屋を定義する[a];
bool lie [a];
bool left1 [a];
bool right1 [a];
int n、cnt = 0;
void av()
{ if(cnt <= 3){ for(int i = 1; i <= n; i ++)cout << Rooms [i] << ''; cout << endl; } } void dfs(int x){ if(x> n){ cnt ++; av(); 戻る; } for(int k = 1; k <= n; k ++)if(!lie [k] &&!left1 [k + x] &&!right1 [x-k + n]){ lie [k] = 1; left1 [k + x] = 1; right1 [x-k + n] = 1; 部屋[x] = k; dfs(x + 1); 嘘[k] = 0; left1 [k + x] = 0;

























right1 [x-k + n] = 0;
}
}
int main()
{ cin >> n; dfs(1); cout << cnt; return 0; }トレースバックは次のとおりです:lie [k] = 1; left1 [k + x] = 1; right1 [x-k + n] = 1;部屋[x] = k; dfs(x + 1);嘘[k] = 0; left1 [k + x] = 0; right1 [x-k + n] = 0;このステップを前のステップに戻して再配置することはできません。概念は、この方法が機能していないということです。前のノードに戻って、別の方法があるかどうかを確認してください。そうでない場合は、ノードに戻るだけです。そのため、[k] = 1になり、[k] = 0になります。















おすすめ

転載: blog.csdn.net/qq_45531709/article/details/107668208