题目描述:
n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数 n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数 n。
输出格式
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。
其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。
输出方案的顺序任意,只要不重复且没有遗漏即可。
数据范围
1≤n≤9
输入样例:
4
输出样例:
.Q..
...QQ...
..Q.
..Q.Q...
...Q.Q..
注意事项:注意定义数组的长度:不能太小,否则后面的数据不通过
解题思路:
从第一行第一个格子开始枚举,如果当前格子没有被标记过,则使该格子当前的行,列,以及对角线,,反对角线上的格子全部赋值为真,因为一行只能有一个皇后,每当每一行填进去了一个皇后,则从下一行开始枚举,以此类推,直到全部枚举完,输出可行的方案。
用ans[]数组存储答案,每找到一个皇后,把当前的列数赋值给ans[];
关于对角线的表示:可以用截距表示,截距相等则为同一条对角线。反对角线,y=-x+b, b=x+y,b这里代表截距,正对角线y=x+b,b=y-x,所以这里的b可能是负的,但作为数组下标,不能是负的,所以我们把正对角线加上一个偏移量,b=y-x+n是没影响的。
参考代码:
``` #include<iostream> using namespace std; const int N= 20; int n; char g[N][N];//存储路径 bool col[N],dg[N],udg[N];//col[]是列,dg[]对角线,udg[]反对角线 void dfs(int u) { if(n==u)//如果找到一种解 { for(int i=0;i<n;i++) cout<<g[i]<<endl;//输出某一行 cout<<endl; return; } for(int i=0;i<n;i++) { if(!col[i] && !dg[u+i] && !udg[n-u+i])//如果'该列''该对角线''该反对角线'上的均为零,则没有值,进行循环 { g[u][i]='Q';//把当前符合的点赋值Q col[i]=dg[u+i]=udg[n-u+i]=true;//并且赋为真 dfs(u+1);//递归到下一层 col[i]=dg[u+i]=udg[n-u+i]=false;//恢复现场,把值全部赋值回去,成'.'; g[u][i]='.'; } } } int main() { cin>>n; for(int i=0;i<n;i++)//全部初始化棋盘为'.'; { for(int j=0;j<n;j++) { g[i][j]='.'; } } dfs(0);//从第零层开始递归 return 0; } ```
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复