[BFS]-宽搜算法总结
2013-12-29 13:16
441 查看
总结一下宽搜中的一些问题,当然还不全面,以后再补充~
问题一:怎么记录步数/层数?
从教主的代码那里学来的方法。int 一个变量t,令t=xx.size();,再while(t--)就可以记录步数或者层数了。
如下:
记录路径的话~就看这道题吧——POJ3414(倒水桶)链接:http://poj.org/problem?id=3414
我们可以通过pre数组来记录上一状态,用by数组来记录从上一状态到这一状态的方式。
然后将达到最终答案的方式by压入栈,通过pre找到上一个by入栈,可以把这一条链上的by都入栈
弹栈的时候,我们就得到了整个路径。
AC代码如下:
问题三:对各种状态讨论神马的经常被坑!
比如这道题,被坑不浅,颇有纪念意义——HDU2612(找路)链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612
题中的@可以走过去,不妨碍搜索下一状态。也就是说while(!xx.empty())里不能写常规的if~else,要if不else。
核心代码:
问题四:巧妙地BFS
POJ光棍题1111~链接:http://poj.org/problem?id=1111
要我找它的边长~一开始真不会。看了教主的代码才明白,原来可以这样想:
每个合法的块一开始都看做加进去会使边长总数增加4,如果它和周边已被搜索过的合法块有公共边(也就是处于上下左右的位置),那么这个新加块给整块图边长的贡献就会-2。对角线上加入的对原图是直接加4。代码就不贴了~想到这些就不难了。
暂时这些问题。欢迎交流~
问题一:怎么记录步数/层数?
从教主的代码那里学来的方法。int 一个变量t,令t=xx.size();,再while(t--)就可以记录步数或者层数了。
如下:
int bfs(******) { * 略 * while(!xx.empty()) { t=xx.size(); while(t--) { //取出队首元素 //如果是终点则返回步数值 else { //搜索下一状态 //如果下一种状态未被访问且没有越界则入队。 } } ans++; //步数加一 } }问题二:怎么记录路径?
记录路径的话~就看这道题吧——POJ3414(倒水桶)链接:http://poj.org/problem?id=3414
我们可以通过pre数组来记录上一状态,用by数组来记录从上一状态到这一状态的方式。
然后将达到最终答案的方式by压入栈,通过pre找到上一个by入栈,可以把这一条链上的by都入栈
弹栈的时候,我们就得到了整个路径。
AC代码如下:
#include <cstdio> #include <iostream> #include <queue> #include <cstring> #include <stack> using namespace std; typedef struct node { int x; int y; }node; int A,B,C,ans,fa,fb; queue<node> xx; int vis[120][120]; node pre[120][120]; int by[120][120]; int ok(int x,int y) { if(x>=0&&x<=A&&y>=0&&y<=B) return 1; return 0; } int judge(node p) { if(p.x==C||p.y==C) return 1; return 0; } void output (int i) { switch(i) { case 1:puts("DROP(1)");break; case 2:puts("DROP(2)");break; case 3:puts("FILL(1)");break; case 4:puts("FILL(2)");break; case 5:puts("POUR(1,2)");break; case 6:puts("POUR(2,1)");break; } } int bfs() { int j; while(!xx.empty()) { int t=xx.size(); for(int i=0;i<t;i++) { node cur; cur=xx.front(); xx.pop(); vis[cur.x][cur.y]=1; if(judge(cur)) { fa=cur.x; fb=cur.y; return ans; } else { node next; for(j=1;j<=6;j++) { if(j==1) { next.x=0; next.y=cur.y; } else if(j==2) { next.y=0; next.x=cur.x; } else if(j==3) { next.x=A; next.y=cur.y; } else if(j==4) { next.y=B; next.x=cur.x; } else if(j==5) { if(cur.x>=(B-cur.y)) { next.x=cur.x-(B-cur.y); next.y=B; } else { next.x=0; next.y=cur.x+cur.y; } } else if(j==6) { if(cur.y>=(A-cur.x)) { next.y=cur.y-(A-cur.x); next.x=A; } else { next.y=0; next.x=cur.x+cur.y; } } if(!vis[next.x][next.y]&&ok(next.x,next.y)) { pre[next.x][next.y]=cur; by[next.x][next.y]=j; xx.push(next); } } } } ans++; } return -1; } int main() { memset(vis,0,sizeof(vis)); cin>>A>>B>>C; node start; start.x=0;start.y=0; xx.push(start); if(bfs()==-1) cout<<"impossible"<<endl; else { cout<<ans<<endl; stack<int> st; node temp; temp.x=fa;temp.y=fb; while(temp.x!=0||temp.y!=0) { st.push(by[temp.x][temp.y]); temp=pre[temp.x][temp.y]; } while(!st.empty()) { output(st.top()); st.pop(); } } return 0; }
问题三:对各种状态讨论神马的经常被坑!
比如这道题,被坑不浅,颇有纪念意义——HDU2612(找路)链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612
题中的@可以走过去,不妨碍搜索下一状态。也就是说while(!xx.empty())里不能写常规的if~else,要if不else。
核心代码:
void bfs(node st,int record[220][220]) { int i,t,tx,ty; xx.push(st); while(!xx.empty()) { t=xx.size(); while(t--) { node cur; cur=xx.front(); xx.pop(); vis[cur.x][cur.y]=1; if(grid[cur.x][cur.y]=='@') { record[cur.x][cur.y]=ans; } for(i=0;i<4;i++) { tx=cur.x+dx[i]; ty=cur.y+dy[i]; if(ok(tx,ty)&&!vis[tx][ty]) { node next; next.x=tx; next.y=ty; xx.push(next); vis[tx][ty]=1; } } } ans++; } }
问题四:巧妙地BFS
POJ光棍题1111~链接:http://poj.org/problem?id=1111
要我找它的边长~一开始真不会。看了教主的代码才明白,原来可以这样想:
每个合法的块一开始都看做加进去会使边长总数增加4,如果它和周边已被搜索过的合法块有公共边(也就是处于上下左右的位置),那么这个新加块给整块图边长的贡献就会-2。对角线上加入的对原图是直接加4。代码就不贴了~想到这些就不难了。
暂时这些问题。欢迎交流~
相关文章推荐
- Word Ladder I
- vijosP1016北京2008的挂钟 BFS + 优先队列
- HDU2717 Catch That Cow BFS
- hdu1026 BFS+记录路径
- JAVA<总汇>
- hdu 1253 胜利大逃亡
- zoj 3420 纯bfs
- BFS | 3984 | 迷宫问题
- BFS | 1426 | Find The Multiple
- BFS | 3278 | Catch That Cow
- BFS | 3126 | Prime Path
- BSF | 1915 | Knight Moves
- Can I Post the lette
- sicily 无路可逃
- BFS和DFS算法
- CodeForces - 329B 《Biridian Forest》 【反向BFS】
- ZOJ 1788 Quad Trees (朴素BFS)
- HDU 4634 - BFS + 状态压缩
- HDU 4678 - Mine - BFS + Game Theory
- Borg Maze(POJ3026)