今天真是风雨大作,似乎整个人变得跟天气一样有些水,今天打死也就只出了两道题,都是广搜索的,说实话,我对搜索的掌握还不太透彻,之前做的都是深搜,对深搜和广搜的区别还不懂。今天做了两道广搜,并且上网看了别的coder对深搜广搜的理解,才稍微对广搜和深搜的做法有所心得。广搜对求最优解的时候能节省一些时间,但是比较占用内存,用的基本是队列,而深搜用的是函数递归的思想,比较节省内存,但是费时间。做了这些题,我才有点摸到了一些套路,比如这道题需要用到广搜的时候,代码中基本是会有设置一个结构体,来代替题目中的一个点或者一个值,然后会用到一个队列queue<结构体>,往里面压每次的情况,若符合就输出题目所求的东西,若队列中没有东西了也没找到符合条件的,就说明找不到。例如今天做的地下城迷宫类型的,用了三维数组来描述地下城的结构,然后就利用队列的特性广搜
while(!q.empty())不过做第一道广搜的时候我把判断能行走的条件之一为接下来的位置是'.'这个卡了我好久,如果条件是这个的话,我相当于吧最后的出口E也当成墙壁看待了,将接下来的位置改为非'#'就成了,今天对广搜有了一些深刻的认知,以后碰见广搜也不会一头雾水了。
{
now=q.front();//确定当前位置
q.pop();
for(int i=0;i<6;i++)
{
next.x=now.x+dl[i];
next.y=now.y+dr[i];
next.z=now.z+dc[i];//寻找下一个位置
if(judge(next.x,next.y,next.z))//判断下一个位置是否可行
{
next.t=now.t+1;//可行,则所求变量加一
if(dun[next.x][next.y][next.z]=='E')return next.t;
vis[next.x][next.y][next.z]=1;
q.push(next);//往队列中压这个位置
}
}
对于今天第二道广搜,真是让我非常难受,第一次提交wrong answer,看了很久,发现我没有重置储存状态的数组vis,而且其中有一个地方,也是新操作,就是个位是偶数的数一定不是素数,在循环遍历的时候能节省好多时间和空间呢。
明天又要训练赛了,早上多出几个题跟进一下进度,下午希望能做的多一点吧,加油:)