博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲
阅读量:6292 次
发布时间:2019-06-22

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

转载请注明本文地址

简单说说宽度优先搜索BFS

说实话,这是第一个自己写的宽度优先搜索的题目。之前也是不太明确之间的差别,好吧。仅仅能说自己学的太渣……

言归正传,对于刚開始学习的人来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧。我表示废话了,我事实上就是这个样子的,然后一直不得甚解。

。。

所以第一次上来。我就直接搜索DFS。结果太明显,就是TLE或者MLE,然后就抓狂中。这可能是非常多刚開始学习的人在開始的时候犯的错误了。

我个人的感觉宽度搜索和深度搜索都是非常暴力的枚举,可是差别呢,还是比較明显的,就比方以下这两题来说,基本上的都是一样,通过题目的描写叙述,都是最快找到,在深度优先搜索中就是要找到全部能到达的最短路径了。所以。事实上应该说都可以找到的,仅仅是花费的时间不一样而已。

总结起来就是下面几点:

1:宽度优先搜索的用意一般都会比較明显。比方最小啊,就是有比較限制的时候,比較多的时候会用宽度优先,这个,能够用一个比喻来说,就是从一个点。滴墨水,看谁先到。这就是宽度,每做一步,墨水都会扩散。然后得到新的起始点,继续扩散,一个循环的过程。

2:深度优先的话,用于枚举多少类型的时候会比較多,非经常见的应用就是8皇后。N皇后的问题了

附上两题的题解

 题目1365:贝多芬第九交响曲

题目链接地址

#include 
#include
#include
using namespace std; struct Node{ int x, y,step;};bool A[101][101];short testCase[8][2]={
{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};int Cal(int x,int y,int ex,int ey,int num){ if(x==ex&&y==ey) return 0 ; queue
p; Node tmp,q; int result=0; tmp.x=x; tmp.y=y; tmp.step=0; p.push(tmp); while(p.size()>0) { tmp=p.front(); p.pop(); for (int i=0;i<8;i++) { q.x=tmp.x+testCase[i][0]; q.y=tmp.y+testCase[i][1]; if(q.x>0&&q.y<=num&&q.x<=num&&q.y>0&&!A[q.x][q.y]) { q.step=tmp.step+1; A[q.x][q.y]=true; if(q.x==ex&&q.y==ey) return q.step; else p.push(q); } } } return -1;} int main(){ int num,x,y,ex,ey; //freopen("data.in","r",stdin); while(scanf("%d",&num)!=EOF) { memset(A,0,sizeof(A)); scanf("%d%d%d%d",&x,&y,&ex,&ey); printf("%d\n",Cal(x,y,ex,ey,num)); } return 0;}/************************************************************** Problem: 1365 User: vincent_ynh Language: C++ Result: Accepted Time:450 ms Memory:1064 kb****************************************************************/

九度 题目1335:闯迷宫

题目链接地址:

#include 
#include
#include
using namespace std;//#define LOCALbool A[100][100];struct Node{ int x,y,step;}; int Cal(int num){ if(num==1) return 0; Node first,second; first.x=0; first.y=0; first.step=0; int testCase[4][2]={
{1,0},{0,1},{-1,0},{0,-1}}; queue
result; result.push(first); while(result.size()>0) { first=result.front(); A[first.x][first.y]=true; result.pop(); for (int i=0;i<4;i++) { second.x=first.x+testCase[i][0]; second.y=first.y+testCase[i][1]; second.step=first.step+1; if(second.x>=0&&second.y
=0&&!A[second.x][second.y]) { A[second.x][second.y]=true; if(second.x==num-1&&second.y==num-1) return second.step; else result.push(second); } } } return -1;}int main(){ int inf=10000;#ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout);#endif int num; while(scanf("%d",&num)!=EOF) { for(int i=0;i

你可能感兴趣的文章
【NOI2010】能量采集
查看>>
错误处理和调试2 - C++快速入门31
查看>>
Poj 2299 Ultra-QuickSort
查看>>
SDUT OJ 数据结构实验之链表五:单链表的拆分
查看>>
c语言学习之基础知识点介绍(四):算术运算符和逗号表达式
查看>>
c语言学习之基础知识点介绍(六):if和switch结构
查看>>
elasticsearch 的Merge
查看>>
网络编程
查看>>
浅析GDAL库C#版本支持中文路径问题
查看>>
快学Scala 第八课 (嵌套类)
查看>>
Linux文件和目录的属性及权限
查看>>
Wannafly挑战赛3
查看>>
解决Ubuntu14.04安装Chrome浏览器打不开的问题
查看>>
INSERT IGNORE 与INSERT INTO的区别
查看>>
JQuery Easy UI 简介
查看>>
【转帖】【面向代码】学习 Deep Learning(四) Stacked Auto-Encoders(SAE)
查看>>
垂直剧中
查看>>
C语言版推箱子
查看>>
BeanPostProcessor出现init方法无法被调用Invocation of init method failed
查看>>
WIN7 X64的运行命令窗口
查看>>