我知道楼下你们都没看懂 他用了位运算和递推 反正你们都喜欢copy 你们就看一下楼下的吧 本人这个只适用于较小数据 下面是那个丧心病狂的数据以及被我修过的程序(然而修了并没有什么用)
输入 13 输出 1 3 5 2 9 12 10 13 4 6 8 11 7
1 3 5 7 9 11 13 2 4 6 8 10 12
1 3 5 7 12 10 13 6 4 2 8 11 9
73712
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int x[2000000];
bool is_ok(int k){ //这是一个判断自己要放得皇后是否与前面冲突的函数
int i=1;
while (i<k){ //k就是你现在放到哪一个皇后了
if (x[i]==x[k] || fabs(x[i]-x[k])==fabs(i-k))
return false;
i++;
}
return true;
}
int main() {
int t=1,n,k,total=0,i;
cin>>n;
x[1]=0;k=1 ;
while (k>0){ //21~33是主要程序
x[k]++; //先穷举一个位置
while (x[k]<=n && !is_ok(k)) x[k]++; //如果不能放就一直++ 直到可以或
if(x[k]<=n) //这个皇后不能放
if(k==n){ //如果放到第n个皇后了 总数++
total++;
if (total<=3){
for (i=1;i<=n;i++)
cout<<x[i]<<' ';
cout<<endl;
}
}
else { //如果这个皇后成功放下来 就尝试放下一个皇后
k++;
x[k]=0; //一定要清零!!!
}
else
k--; //放不下来就回溯
} //这里打出所有方法是在有一个方法后强制让他回溯 就能产生第二种格局
cout<<total; //打印总数
return 0;
}