链接: 洛谷-八皇后
emm。。。 基本就是书上写的呀,
【对角线相等 y-x相等 以及y+x相等】
然后不停的往下放 放不下就换一下,换另一个位置放
怎么判断放不下呢 ?放不下就是会冲突,会和当前的或者对角线的冲突。
相等的时候输出。
这是一个回溯的标准写法。。
代码整洁了很多。。。
但是最后超时了。。。 zj爸爸让我优化_(:з」∠)_
所以期待饭后更新版 吧
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstring>
#include<stdio.h>
using namespace std;
typedef long long ll;
int n; int cnt;
int a[14];// bigger
void travel(int cur) {
if (cur == n + 1)//cur可是 从0 到1
{
cnt++;//从0 到1 到2 到3
if (cnt <= 3)
{
for (int i = 1; i <= n; i++)i == n ? printf("%d\n", a[i]) : printf("%d ", a[i]);//cout << a[i] << endl : cout << a[i] << " "; }
}
}
else
{
for (int i = 1; i <= n; i++) {
a[cur] = i;//这是个整数...
bool flag = 0;//false; 空的
for (int j = 1; j <= cur - 1; j++) {
if (a[j] == a[cur] || cur - a[cur] == j- a[j] || cur + a[cur] == j + a[j]) {
flag = 1;
break;
}
}//当前的放i 会不会有什么冲突
if (!flag)//==0
travel(cur + 1);
}
}
}
int main() {
cnt = 0;
scanf("%d", &n);//cin >> n;
travel(1);
printf("%d\n", cnt);// cout << cnt << endl;
return 0;
}
emmm?这当然超时了/… 书上有好的版本的,自己翻了-.- 不打了
上面的方法不常用.. 在luogu开了氧气优化过了(有啥用 摊手)
还是dfs bfs什么的更好