当第k行与前面的k-1行不冲突的时候,才将皇后放在不冲突的位置。
for(i = 1; i <= N; i++)//(i列)前面的(k-1)行皇后已经摆好,看第k行的i列皇后摆放位置是否和前面的k-1行冲突
{
int j;
for(j = 1; j < k; j++)//前面的k-1行(j行)
{
if(queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))//同一列或者列差等于行差
{
break;
}
}
if(j == k)//k与前面的k-1行都没有冲突
{
queenPos[k] = i;
NQueen(k+1);
}
}
#include<iostream>
#include<cmath>
using namespace std;
int N;
int queenPos[100];
void NQueen(int k);
int main()
{
cin >> N;
NQueen(1);
return 0;
}
void NQueen(int k)
{
int i;
if(k==N+1)
{
for(i = 1; i <= N; i++)
{
cout << queenPos[i]<< " ";//第i行的皇后放在第queenPos[i]列
}
cout << endl;
return ;
}
for(i = 1; i <= N; i++)//(i列)前面的(k-1)行皇后已经摆好,看第k行的i列皇后摆放位置是否和前面的k-1行冲突
{
int j;
for(j = 1; j < k; j++)//前面的k-1行(j行)
{
if(queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))//同一列或者列差等于行差
{
break;
}
}
if(j == k)//k与前面的k-1行都没有冲突
{
queenPos[k] = i;
NQueen(k+1);
}
}
}
计数:
#include<iostream>
#include<cmath>
using namespace std;
int N;
int queenPos[100];
void NQueen(int k);
int sum = 0;
int main()
{
cin >> N;
NQueen(1);
cout << "sum=" << sum << endl;
return 0;
}
void NQueen(int k)
{
int i;
if(k==N+1)
{
++sum;
for(i = 1; i <= N; i++)
{
cout << queenPos[i]<< " ";//第i行的皇后放在第queenPos[i]列
}
cout << endl;
return ;
}
for(i = 1; i <= N; i++)//(i列)前面的(k-1)行皇后已经摆好,看第k行的i列皇后摆放位置是否和前面的k-1行冲突
{
int j;
for(j = 1; j < k; j++)//前面的k-1行(j行)
{
if(queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))//同一列或者列差等于行差
{
break;
}
}
if(j == k)//k与前面的k-1行都没有冲突
{
queenPos[k] = i;
NQueen(k+1);
}
}
}
DFS:
#include<iostream>
using namespace std;
bool d[100] = {0}, b[100] = {0}, c[100] = {0};
int sum = 0;
int a[100];
int search(int);
int print();
int n;
int main()
{
cin >> n;
search(1);
cout << "sum=" << sum << endl;
return 0;
}
int search(int i)//i行
{
int j; //j列
for(j = 1; j <= n; ++j)
{
if((!b[j]) && (!c[i+j]) && (!d[i-j+7]))
{
a[i] = j;//第i行放在第j列
b[j] = 1;
c[i+j] = 1;
d[i-j+7] = 1;
if(i == n) print();
else search(i+1);
b[j] = 0;
c[i+j] = 0;
d[i-j+7] = 0;
}
}
}
int print()
{
int i;
sum++;
// cout << "sum=" << sum << endl;
for(i = 1; i <= n; ++i)
cout << a[i] << " ";
cout << endl;
}