博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1045 Fire Net
阅读量:5310 次
发布时间:2019-06-14

本文共 1437 字,大约阅读时间需要 4 分钟。

拿到这道题刚开始就觉得是bfs,其实自己一直不太能清晰的分析出一个题用的是bfs,还是dfs。尽管他们的原理我都大概知道,但可能就是 因为我只是大概知道吧。。总是觉得dfs和bfs这两个东西是可以相互使用的。

下面对dsf和bfs做一个总结吧:

DFS在于从一个初始状态出发,一直转移状态直到搜到目标或搜到状态无法进行转移为止,而BFS在于一层一层地扩展状态,这样首先找到的目标便一定是用时或步数最少的。

DFS几乎适用于所有情况,因为这本身是一种遍历所有状态的搜索,只不过在寻找最小步或最小时间的情况下比较慢,无法快速找到目标,但在程序世界里DFS本身也有不适用的情况,如果状态没有下限即转移的深度没有下限那么便无法深搜,同样,BFS可能存在一层状态都扩展不完的情况,这样便才会有迭代加深搜索等扩展搜索的出现,它结合了两者的优点且实际应用效果不错。紫书上面的名词“解答树”便很好地描述了所有状态转移的过程,当然这个似乎与我们无关,但是其实也是一种刻画搜索过程的有利工具。

在解答题目时你需要明白一下几点:

1、如何进行状态的转移,简单地说怎么进行下一步的选择

2、是否需要标记已经转移过的状态以及怎么标记已经转移过的状态以不重复转移,你不能单一地判断,也就是要综合所给的题中所有出现的变化,在这个阶段中,我标记这个阶段时的状态,因为很可能不止“你”在变化,图中的情况也在变化。

 3、怎么去除没必要的或不存在的状态,因为有些状态是不需要进行转移或扩展的。

题意:有一个n行n列的网格,可以往里面填炮台,炮台的炮可以沿着行或者列发射,但是不可以穿过墙。现在问最多可以放多少个炮台,使得它们不会打到对方。

注意:表示一个点的方式可以只用一个数,如这题中的k,比如说一个点的坐标是(x,y),k=x*n+y,n为每行的列数。要恢复成原来的坐标就是x=k/n,y=k%n就可以了。

#include 
#include
#include
#include
using namespace std;int n,Max;char mp[5][5];int check(int k){ int r=k/n,c=k%n; for(int i=c;i>=0;i--)//判断这一行前面有没有炮台 { if(mp[r][i]=='X') break; else if(mp[r][i]=='@') return 0; } for(int i=r;i>=0;i--)//判断这一列前面有没有炮台 { if(mp[i][c]=='X') break; else if(mp[i][c]=='@') return 0; } return 1;}void dfs(int k,int cnt){ if(k==n*n)//把棋盘遍历完一次后,更新Max { if(Max

还有就是递归回溯到那个地方总是感觉有点不是那么清楚,递归到某个点的时候你可以选择在这个点放炮和不在这个点放炮,回溯到时候就是包含不再这个点放炮的这么一个操作。

转载于:https://www.cnblogs.com/qie-wei/p/10160182.html

你可能感兴趣的文章
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
机器视觉:SSD Single Shot MultiBox Detector
查看>>
201521123044 《Java程序设计》第1周学习总结
查看>>
MIT Scheme 的基本使用
查看>>