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

方法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 ;
}

八皇后(dfs+回溯)的更多相关文章

  1. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  2. 八皇后,回溯与递归(Python实现)

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

  3. 八皇后(DFS)

    题目描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...

  4. 洛谷 - P1219 - 八皇后 - dfs

    https://www.luogu.org/problemnew/show/P1219 一开始朴素检查对角线就TLE了,给对角线编码之后压缩了13倍时间? 找了很久的bug居然是&&写 ...

  5. 一道算法题-八皇后问题(C++实现)

    八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ...

  6. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  7. ACM:回溯,八皇后问题,素数环

    (一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...

  8. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  9. 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯

      算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB      问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...

随机推荐

  1. YC大牛的判题任务-想法

    YC大牛的判题任务 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class ...

  2. ubuntu下修改apache2.4的rewrite

    sudo a2enmod rewrite 修改/etc/apache2/apache2.conf中 AllowOverride None 为 AllowOverride ALL 重启 service ...

  3. .Net的要知道的一些事

    1.什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式? .Net是微软推出的框架 CLI是公共语言接口(规范) CLR是公共语言 ...

  4. 【转】phpcms基础内容

    <?php 思路: 一.目前在企业中使用比较多的cms内容管理有如下几种: 1.dedecms 2.phpcms 二.我们选择学习v9版本的phpcms,主要有以下几点原因: 1.基于MVC模式 ...

  5. Cocos2d-x 3.2 项目源代码从Mac打包到安卓教程【转自:http://www.2cto.com/kf/201410/342649.html】

    当我们用Xcode写好一个项目的源码之后,如何将它导入到安卓手机中呢?下面我来给大家一步一步讲解: 首先,我们打开终端,cd到Cocos2d-x 3.2文件夹中(注意不是你写的项目文件夹,而是官方项目 ...

  6. [codevs1029]遍历问题

    [codevs1029]遍历问题 试题描述 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中 ...

  7. Linux之编译需要的文件变化时刻

  8. 有向图寻找(一个)奇环 -- find an oddcycle in directed graph

    /// the original blog is http://www.cnblogs.com/tmzbot/p/5579020.html , automatic crawling without l ...

  9. jsp调用java方法 function taglib

    1.新建tld文件: my-functions.tld: <?xml version="1.0" encoding="UTF-8"?> <ta ...

  10. php bom \ufeff

    2015年5月29日 16:50:56 星期五 五月的最后一个周五............. 前两天遇到一个问题 PHP 返回json数据, 其他人死活解析不出来 json_last_error(); ...