Day2

       今天是第二天,今天学了剪枝和Bfs,虽然说,我内心是拒绝的,感觉搜索好难啊,好多听懂了但是还是不会做的题Day2

       Bfs和dfs的区别就是dfs用递归辅助,而Bfs用队列维护。我们常常用一个队列(就是那先进先出的玩意)来储存当前遍历到,但为处理的状态,同时,我们要保证队列中不会出现两个一样的状态。我们通过一道题来整理Bfs的模板:

       假如说我们需要通过S开始进行Bfs寻找一条从S到T的路(如图所示):

Day2

        因为我们由浅到深遍历了所有节点,我们遍历到的节点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;
}

        从搜索开始,才感觉到基础是多么的重要啊,老师啊,你就站在不远的讲台上,可你讲的东西却是那么渺茫,基础不好学深入的东西更累啊~