本题是求至少几次完成,用广搜最方便,因为第一次搜到的便是正确答案,于是就可以愉快的return 0了!!!
老规矩,先呈现我的结构体:
struct f { int t,n; }v[500]; int l=0,r=1;
我是使用队列,v就是队列,l是左指针,r是右指针。(好吧,感觉我的BFS好像跟其他人的不太一样,都怪wasa855)
然后需要判重:
bool u[250];
然后就可以开始愉快的BFS了:
//退出机制其实就是当右边界不再更新时,也就是左边界追上右边界时,就退出(使用这种方法一定要判重) //如果单纯的使用一个bool判断,可能会提早退出 while(l<=r) { up=v[l].t+k[v[l].t]; down=v[l].t-k[v[l].t]; if(up==b||down==b) { printf("%d",v[l].n+1); return 0; } if(up<=n&&u[up]==false) { u[up]=true;//判重 v[r].t=up; v[r].n=v[l].n+1; ++r;//不要忘记加右边界 } if(down>=1&&u[down]==false) { u[down]=true;//判重 v[r].t=down; v[r].n=v[l].n+1; ++r;//不要忘记加右边界 } ++l;//不要忘记加左边界 }
up就是升到的楼层,down是下降到的楼层。
很多小盆友可能不理解BFS的运作思路,这里顺带提一下:
其实就是横着搜!!!
大佬wasa855说,深搜和广搜就是傻子和聪明人走迷宫的区别。
深搜就是傻子一个劲的往里冲,碰到不能走或者边界(边界好像也不能走),就往回走(回溯)
广搜呢,就是聪明人,他们把能走的都先看一遍,再往下走。
不过傻子和聪明人各有所长,大家要因题而异。(不要因为我说深搜是傻子就不用)
2018-03-27