33,027
社区成员




#include <iostream>
#include <cmath>
using namespace std;
#define N 4
int row[N];
void rn_queens(int k);
bool position_ok(int k);
void rn_queens(int k)
{
for (row[k]=0;row[k]<N;row[k]++)
{
if(position_ok(k))
{
if (k==N)
{
for (int i=0;i<N;i++)
{
cout<<row[i]<<","<<i<<endl;
}
cout<<endl;
system("pause");
}
else
{
rn_queens(k+1);
}
}
}
}
bool position_ok(int k)
{
for (int i=0;i<k-1;i++)
{
if(row[k]==row[i]||abs(row[k]-row[i])==k-i)
return false;
}
return true;
}
int main()
{
for (int i=0;i<N;i++)
{
row[i]=0;
}
rn_queens(0);
return 0;
}
n_queens(n){
rn_queens(1,n)
}
rn_queens(k,n){
for row[k]=1 to n
if(position_op(k,n))
if(k==n){
for i=1 to n
print(row[i]+" ")
println()
}
else
rn_queens(k+1,n)
}
position_ok(k,n){
for i=1 to k-1
//abs是绝对值
if(row[k]==row[i]||abs(row[k]-row[i])==k-i)
return false;
return true;
}
#include<iostream>
using namespace std;
bool b[27],c[27],d[27];
int a[9],i;
void print()
{
int i1;
i++;
cout<<i<<" ";
for (i1=1;i1<=8;i1++)
cout<<a[i1]<<' ';
cout<<endl;
}
void sou(int i)
{
for (int i1=1;i1<=8;i1++)
if (b[i1]&&c[i+i1]&&d[i-i1+8])//运用直线方程求解 ,
{
a[i]=i1;
b[i1]=false;
c[i+i1]=false;
d[i-i1+8]=false;
if (i<8) sou(i+1);
else print();//输出
b[i1]=true;//释放
c[i+i1]=true;
d[i-i1+8]=true;
}
}
int main()
{
for (int o=1;o<=27;o++)//初始化变量
{
b[o]=true;c[o]=true;d[o]=true;
}
i=0;
sou(1);
system("pause");
}
/*
Name: 八皇后问题
Copyright:
Author:
voyage1323
Date: 22-03-08 08:45
Description:递归线性搜索,主要运用排除法,及回溯
*/
#include <iostream>
const int N = 8;
int count=0;
//用于记录列 和 两个斜线方向是否存在皇后 check做到O(1)
bool l[N+1]={1,1,1,1,1,1,1,1,1};
bool x[2*N]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
bool y[2*N]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
inline bool check(int n,int i)
{
return l[i]&x[n-i+N]&y[n+i-1];
}
void queens(int n)
{
int i;
if(n==N+1)
count++; //得到解
else
{
for(i=1;i<=N;i++)
{
if(check(n,i))
{
l[i]=0; //选择
x[n-i+N]=0;
y[n+i-1]=0;
queens(n+1);
l[i]=1; //回溯
x[n-i+N]=1;
y[n+i-1]=1;
}
}
}
}
int main()
{
queens(1);
printf("%d\n",count);
return 0;
}