八皇后问题

题目描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方


  1. 引入状态数组vis[8][8],vis[i][j]表示(i,j)被多少个皇后攻击
  2. 之所以不用0,1来表示(i,j)是否被攻击,是因为回溯时,拿走一个皇后,也要将它攻击的位置清除,但如果把他攻击的位置变成0,那别的皇后对这个位置的攻击可能也会失效
  3. 输出二维数组时,输出a[i][j]应改成a[j][i]

对于第3条,可以试一下

  


#include<bits/stdc++.h>
using namespace std;
int n=8;
int vis[8][8];
int a[8][8];
int ans=0;
void setVis(int i,int j,int f){
a[i][j]=(f==1);
vis[i][j]+=f;
for(int k=0;k<n;k++){
if(k!=j) vis[i][k]+=f;
}
for(int k=0;k<n;k++){
if(k!=i) vis[k][j]+=f;
}
for(int k1=i,k2=j;k1<n && k2>=0; k1++,k2--){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1>=0 && k2<n; k1--,k2++){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1>=0 && k2>=0; k1--,k2--){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
for(int k1=i,k2=j;k1<n && k2<n; k1++,k2++){
if(k1!=i && k2!=j) vis[k1][k2]+=f;
}
}
void dfs(int i) {
if(i==n) {
cout<<"No. "<<++ans<<endl;
for(int j=0; j<n; j++) {
for(int k=0; k<n; k++) {
cout<<a[k][j]<<" ";
}
cout<<endl;
}
return;
}
for(int j=0;j<n;j++){
if(!vis[i][j]){
setVis(i,j,1);
dfs(i+1);
setVis(i,j,-1);
}
}
}
int main() {
dfs(0);
return 0;
}

 

posted on   可爱楷玩算法  阅读(19)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示