八皇后问题
题目描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方
- 引入状态数组vis[8][8],vis[i][j]表示(i,j)被多少个皇后攻击
- 之所以不用0,1来表示(i,j)是否被攻击,是因为回溯时,拿走一个皇后,也要将它攻击的位置清除,但如果把他攻击的位置变成0,那别的皇后对这个位置的攻击可能也会失效
- 输出二维数组时,输出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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~