说到八皇后,大一时弄得似懂非懂的,今天刷题刚好碰到类似的,于是誓要把它搞明白,写博客以记之~
搞懂八皇后问题,对dfs,递归,打标记等知识的理解有很大的帮助。
这是:例题链接 (点它点它点它)
注释写得很明白了嘻嘻嘻
#include <iostream>
#include <cmath>
using namespace std;
int n, ans, book[15], a[15], b[15];
void dfs(int hang){ //hang==1 表示从第一行开始
if(hang>n){ //大于棋盘的行数,递归终止
ans++;
if(ans <= 3){
printf("%d", b[1]);
for(int i = 2; i <= n; i++){
printf(" %d", b[i]);
}
printf("\n");
}
return; //及时退出
}
for(int lie = 1; lie <= n; lie++){ //lie表示列
if(book[lie]==0){ //book[lie]==0 表示这一列目前没有任何皇后,保证列数不会重复
bool ok = true;
for(int pre = 1; pre < hang; pre++){ //试着放置皇后,看是否满足对角线不重复
if(abs(hang-pre)==abs(lie-b[pre])){
ok = false;
break;
}
}
if(ok){ //ok==true 表示对角线不重复,即可以把皇后放置在此处
book[lie] = 1; //此列以占用
b[hang] = lie; //该皇后的坐标是(hang, lie)
dfs(hang+1); //保证行数不会重复,找下一行的皇后
book[lie] = 0; //重点:回溯,清除这一行的占用,找其他的组合
}
}
}
}
int main()
{
scanf("%d", &n);
dfs(1);
printf("%d", ans);
}
加油8!!!
“Don’t be too hard on yourself about like ‘How does my decision today, affect me in 5 years from now?!’ There’s a difference between being excited for a challenge, and becoming absorbed in anxiety that’s borrowed from the future. Don’t miss it. Live in the moment.”
“不要对自己过于苛刻,比如纠结于“我今天做的决定会不会影响五年后的自己” ,对挑战感到兴奋和因为未来的不确定而感到焦虑是不一样的。不要错过此刻的精彩,活在当下。”
——Taylor Swift 2019.11.11语