这周听取了老师的建议,每天坚持看博客,截止到目前这周已阅读55篇博客,通过这个方法,感觉这一周收获不少。在这55篇博客中,有25篇关于思维的题解(主要是以Codeforces上题目为主),10篇有关STL运用的题目,15篇初涉搜索的题解,还有5篇关于广度优先搜索和深度优先搜索的理论知识。
首先,分三个方面来对这周进行总结:
1、广度优先搜索(BFS):
BFS的基本思想在课上的PPT中已经展现的很清楚了,顾名思义就是广,先一层中进行搜索,在这一层都搜索完之后再进行下一层。学习了广度优先搜索后,广度优先搜索可以解决什么问题呢?
类似于层级遍历,在广度优先遍历中,如果将每次“前进”或路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为广度优先生成树。针对BFS,这一周学习最多的问题就是最优解与最短路径问题,因为广度搜索遍历是一层一层的去搜索从入口到出口的遍历过程,所以在找到出口的时候,深度不一定是最深,但一定是当前最短路径(亦或是最优解),同样,走迷宫、最少操作等问题也可以用广度优先搜索解决。Set<Node> visited;
2、深度优先搜索(DFS):
首先搜索顶点A;依次从A的未被搜索的邻点出发,对图进行深度优先遍历(沿一条路一直走到黑);直至图中和A有路径相通的顶点都被搜索;若此时图中尚有顶点未被搜索,则从一个未被搜索的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被搜索过为止。这个方式给我带来一种执着不服输的精神。
对于深度优先搜索,可以解决迷宫问题、八数码/华容道问题、最远路径问题(不太常用)、传授问题等。因为深度优先搜索按照某种条件往前试探搜索,如果前进中遭到失败(正如遇到死胡同)则退回头另选通路继续搜索,直到找到满足条件的目标为止。
无论是广度优先搜索还是深度优先搜索,对一个已经访问过的点如何做标记呢?学到了一个方法:可以设置一个数组,当你经过而且并不是最终结果时,把数组元素赋值为0,这样可以分辨出。或Set visited;避免走回头路。
3、sort函数
在第三周学习STL的时候,对sort函数就有了一些了解,但在这一周参加CF的时候,发现对sort函数的运用根本不熟悉,使用sort()方法就可以只需要一条语句就可以实现排序,会缩短代码长度,更好的执行下面的语句,下面是我最初写的代码片段和最后用sort()的的代码:
最初的:
int k;
int max1;
int max2;
int q;
int w;
int c;
for(k=0;k<n;k++)
{ max1=a[0];
max2=a[0];
for(q=0;q<n;q++)
{if (a[q]>max1)
max1=a[q];}
for(w=0;w<n;w++)
{if (a[w]<max1&&a[w]>max2)
max2=a[w];}
c=max1-max2;}
if(c>=2&&n!=1)
cout<<"NO"<<endl;
if(c==1&&n!=1)
cout<<"YES"<<endl;
if(c==0&&n!=1)
cout<<"YES"<<endl;
if(c==0&&n==1)
{
if(max2==1)
cout<<"YES"<<endl;
if(max2!=1)
cout<<"NO"<<endl;
}
}
使用sort:解决了一长串代码的问题
sort(a+1,a+1+n);
c=a[n]-a[n-1];
if(c>=2)
cout<<"NO"<<endl;
else cout<<"YES"<<endl;
最后总结:
对于一些方法知识点,虽然有学习了解,但在实战中并不能熟练的应用,这说明储备的知识还不够全面,并不深刻,会出现大大小小的错误。初学深度与广度,自己写的代码还没有成功,所以这次总结没有列出,在下一周希望可以更多的练习自己写,而且是专项练习,这样在之后的综合运用中才可以得心应手。