今天是第二天,今天学了剪枝和Bfs,虽然说,我内心是拒绝的,感觉搜索好难啊,好多听懂了但是还是不会做的题
Bfs和dfs的区别就是dfs用递归辅助,而Bfs用队列维护。我们常常用一个队列(就是那先进先出的玩意)来储存当前遍历到,但为处理的状态,同时,我们要保证队列中不会出现两个一样的状态。我们通过一道题来整理Bfs的模板:
假如说我们需要通过S开始进行Bfs寻找一条从S到T的路(如图所示):
因为我们由浅到深遍历了所有节点,我们遍历到的节点X就是S到X的最短路径,若图中的路没有长度区别,那么S到T的一定是最短路。
代码模板如下(较简略,伪代码):
int adj[N][N]={},S,T,n;
int a[N]={},vis[N]={},dis[N]={},head=1,tail=0;
......(一堆初始化和输入)
q[++tail]=S;
vis[S]=true;
dis[S]=0;
while(head<=tail)
{
int x=q[head++];
for(int i=1;i<=n;i++)
if(adj[x][i]&&!vis[i])
{
q[++tail]=i;
vis[i]=true;
dis[i]=dis[x]+1;
if(i==T)
{
cout<<dis[T]<<endl;
break;
}
}
}
哎,然后下午的考试,原地爆炸,不过比昨天好些,至少没爆零。
回文串
题目大意:小A想知道能否用上他拥有的所有字符构造一个回文串。
分析:由题意可知,只有字母是一个时,则此条件成立,两个及以上皆不满足。(不要问我为什么,我也说不清楚)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("palindromic.in","r",stdin);
freopen("palindromic.out","w",stdout);
int n,a[1010],s=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
if(a[i]%2!=0) s++;//统计字母奇数次的个数
if(s>=2) cout<<"YES"<<endl;//判断出现奇数的次数是否是1,是1输出YES,非1输出NO。
else cout<<"NO"<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
从搜索开始,才感觉到基础是多么的重要啊,老师啊,你就站在不远的讲台上,可你讲的东西却是那么渺茫,基础不好学深入的东西更累啊~