重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次:

方法1:逐行放置皇后,然后递归;

代码:

 #include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std; ll ans=;
int c[MAXN]; void dfs(int cur)
{
if(cur==MAXN) ans++; //***因为是逐行放置的,所以只要走到最后一行则肯定可行
else
{
for(int i=; i<MAXN; i++) //***尝试在第cur行的第i列放置皇后
{
int flag=;
c[cur]=i;
for(int j=; j<cur; j++)
{
if(c[cur]==c[j]||c[cur]+cur==j+c[j]||c[cur]-cur==c[j]-j) //**判断皇后是否会相互攻击
{
flag=;
break;
}
}
if(flag)
{
dfs(cur+); //***如果合法,继续递归
}
}
}
} int main(void)
{
dfs();
cout << ans << endl;
return ;
}

方法2:思路和方法1差不多,区别是用二维数组vis[2][]来标记之前皇后的位置,判断是否会相互攻击

代码:

 #include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std; ll ans=;
int c[MAXN], vis[][*MAXN]; void dfs(int cur)
{
if(cur==MAXN) ans++; //***因为是逐行放置的,所以只要走到最后一行则肯定可行
else
{
for(int i=; i<MAXN; i++)
{
if(!vis[][i]&&!vis[][cur+i]&&!vis[][cur-i+MAXN])
{
c[cur]=i; //***尝试将皇后放置在第cur行第i列
vis[][i]=vis[][cur+i]=vis[][cur-i+MAXN]=; //**标记
dfs(cur+); //**递归
vis[][i]=vis[][cur+i]=vis[][cur-i+MAXN]=; //**去除标记
}
}
}
} int main(void)
{
dfs();
cout << ans << endl;
return ;
}

最新文章

  1. Oracle 把秒转成时分秒格式(hh24:mm:ss);检测字符串是否是数字;字符串转换为数字
  2. 简单回顾NPOI导入导出excel文件
  3. Dynatable – 基于 HTML5 &amp; jQuery 的交互表格插件
  4. .NET面试题大全,包括微软、华为、中兴等大企业的面试真题
  5. [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  6. design the relations
  7. curl命令访问域名
  8. 2017TSC世界大脑与科技峰会,多角度深入探讨关于大脑意识
  9. Linux常用命令-jdk和Tomcat
  10. accept 文件描述符用尽处理
  11. linux下使用异步通知
  12. ASP.NET Core中实现单体程序的事件发布/订阅
  13. Nginx支持 React browser router
  14. 小程序git发布
  15. windows下php7.1安装redis扩展以及redis测试使用全过程
  16. Linux后台执行的方法 - 关闭、退出不影响
  17. kprobe原理解析
  18. 17-(基础入门篇)GPRS(Air202)串口
  19. Java栈的简单实现
  20. 22.struts2-拦截器.md

热门文章

  1. php数据结构与算法
  2. ASP.NET发送邮件(QQ发送)
  3. BZOJ3083——遥远的国度
  4. BZOJ2049——[Sdoi2008]Cave 洞穴勘测
  5. net-snmp配置文件详解
  6. 9.4---集合子集(CC150)
  7. idea 排除编译文件,恢复编译
  8. MySQL用法
  9. HTK搭建语音拨号系统实验材料下载
  10. POJ 1661