コード1 (学校の弟版)
#include <ビット/ STDC ++ H.>
使用して名前空間STD;
int型のL [15];
BOOL S [15]; // SADが同じ機能スラッシュは、ABS()は絶対値を表しているかどうかを判断する
SAD BOOL(int型のx、int型I){// xは現在の行で、iはライン片の現在位置である
(INT J = 1、J <X; J ++){// J 行の前L [j]は、j番目の行の位置を示します
(ABS(XJ)== ABS場合 (IL [J]))falseを返す; // もし同じ対角線上に、ライン-前の列の行=絶対値-列の絶対値
}
trueに戻り;
}
int型N-、CNT;
ボイドプリント(){
用(INT I = 1; I <= N - 、Iは++)
COUT << L [I] << "";
COUT << ENDL; //ラップ
}
インラインボイドDFS( Xはint){
// X COUT << << ENDL、デバッグ部
。== +(N-X IF 1){
++ CNT;
IF(CNT <= 3)。
プリント();
を返します;
}
以下のために(INT i = 1; iが <= N; iは++){// X 電流線、iは現在の行の位置である
場合(!S [I] || SAD(X、I))// 場合に同じランプラインは、ライン-前の行=行の絶対値-列の絶対値が
続行;
// << COUT "asdawe" << ENDL;デバッグ部分
S [I]がtrueに=;
L [X] = I;
DFS (X + 1);
S [I]はfalse =;
L [X]は= 0;
}
}
(){int型メイン
CIN N - >>;
DFS(1);
COUT << CNTは、
0を返します;
}
コード2人の先輩版!!
INTチェス[15]。
ブールフラグ[100]。
すべて= 0 int型。
(INT I = 1 iは++; iが見つけ<)のための
IF(ABS(チェス[I] - NUM)==を(見つける-I))を
falseを返します。
trueを返します。
}
for(int i = 1; i<=N; i++)
cout << chess[i] << " ";
cout << endl;
}
if(num==N+1) {
all++;
if(all<=3)
print();
return;
}
for(int i = 1; i<=N; i++) {
if(!flag[i] && isUseful(i,num)) {
chess[num] = i;
flag[i] = true;
dfs(num+1);
flag[i] = false;
}
}
}
cin >> N;
dfs(1);
cout << all <<endl;
return 0;
}
#include<cstring>
int r[15], c[15], zd[30], cd[30],cnt;
int n;
void print(){
for (int i = 1; i <= n; ++i)
printf("%d ", r[i]);
puts("");
}
inline void dfs(int x){
if (x == n + 1){
++cnt;
if (cnt <= 3)
print();
return;
}
for (int i = 1; i <= n; ++i){
if (c[i] || zd[x - i + n + 1] || cd[i + x])
continue;
c[i] = zd[x - i + n + 1] = cd[i + x] = 1;
r[x] = i;
dfs(x + 1);
c[i] = zd[x - i + n + 1] = cd[i + x] = 0;
r[x] = 0;
}
}
int main(){
scanf("%d", &n);
dfs(1);
printf("%d", cnt);
return 0;
}