解题思路:
2018/3/29 16:8
首先理解八皇后,然后就是一个使用两个八皇后叠加的问题,通过多设置几个数组就可以实现2*n皇后的问题,注意定义数组记录是否访问这一行或者这一列的时候,数组的值要大一些,防止数组越界。
然后就是一个最基本的DFS就可以了。
#include<cstdio> #include<cstring> int a[9][9],vis1[9],vis2[9],cnt,n; int x1[19],x2[19],y1[19],y2[19]; void DFS(int dep) { if(dep==n+1) { cnt++; return ;} for(int i=1;i<=n;i++) { if(!vis1[i] && a[dep][i] && !x1[dep+i] && !y1[dep-i+n]) { vis1[i]=1; a[dep][i]=0; x1[dep+i]=1; y1[dep-i+n]=1; for(int j=1;j<=n;j++) { if(!vis2[j] && a[dep][j] && !x2[dep+j] && !y2[dep-j+n]) { vis2[j]=1;a[dep][j]=0; x2[dep+j]=1; y2[dep-j+n]=1; DFS(dep+1); vis2[j]=0;a[dep][j]=1; x2[dep+j]=0; y2[dep-j+n]=0; } } vis1[i]=0; a[dep][i]=1; x1[dep+i]=0; y1[dep-i+n]=0; } } } int main(void) { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); DFS(1); printf("%d",cnt); return 0; }
0.0分
16 人评分
C语言程序设计教程(第三版)课后习题5.7 (C++代码)浏览:879 |
2006年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:726 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:416 |
1052题解(链表操作)浏览:782 |
C语言程序设计教程(第三版)课后习题6.7 (C++代码)浏览:603 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:589 |
这是我的第一篇文章浏览:265 |
【密码】 (C语言代码)浏览:574 |
计算表达式浏览:693 |
IP判断 (C语言代码)浏览:532 |
海洋之心 2020-03-06 19:26:41 |
能看懂别人写的算法的代码,说明你很厉害。
冲进前五百冲鸭 2020-03-07 16:42:46 |
我这算什么厉害,大神才是真的厉害,我还要学很多呢,这个算法我自己都没做出来(狗头)