hdu 1728 逃离迷宫 (BFS)
2012-12-05 21:35
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。注意不要把行列搞混了。
刚开始一直WA,因为我把它当一般的bfs走迷宫了,一走到就弹出,这样只是经过的时间最短,拐弯数却不是最优的。看了别人的解题报告,才明白,既然这道题是计算拐弯数,那就把这个方向上能拐弯的都拐了,所以把运动的方向有四个点,改成一个四个方向,搜遍方向上的可达点。
给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。注意不要把行列搞混了。
刚开始一直WA,因为我把它当一般的bfs走迷宫了,一走到就弹出,这样只是经过的时间最短,拐弯数却不是最优的。看了别人的解题报告,才明白,既然这道题是计算拐弯数,那就把这个方向上能拐弯的都拐了,所以把运动的方向有四个点,改成一个四个方向,搜遍方向上的可达点。
/* 运动的方向不仅仅是周围的四个点,因为没求最短时间,所以避免提前结束bfs,就四个方向搜到底 */ #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; struct node { int x,y,k;//k存拐弯数 }; int t,n,m,x1,x2,y1,y2,k,vis[110][110]; char map[110][110]; int dx[]={0,0,-1,1}; int dy[]={1,-1,0,0}; void bfs(node vs,node vd) { int flag=0; queue<node>q; node vn,vw; vn.x=vs.x; vn.y=vs.y; vn.k=-1;//-1,不是0; vis[vs.x][vs.y]=1; q.push(vn); while(!q.empty()) { vn=q.front(); q.pop(); if(vn.x==vd.x&&vn.y==vd.y&&vn.k<=k) { flag=1;break; } vw.k=vn.k+1;//因为前面搜完了一个方向,就肯定会拐弯,所以要+1,也因此起点的k初始化为-1; { int i; for(i=0;i<4;i++) { int a=vn.x+dx[i]; int b=vn.y+dy[i]; while(a>=0&&a<n&&b>=0&&b<m&&map[a][b]!='*')//搜完一个方向 { if(!vis[a][b]) { vis[a][b]=1; vw.x=a;vw.y=b; q.push(vw); } a+=dx[i]; b+=dy[i]; } } } } printf("%s\n",flag?"yes":"no"); } int main() { scanf("%d",&t); while(t--) { node vs,vd; int i; memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%s",map[i]); scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);//注意他说的行列和常规的想法不一样,免得自己搞混,所以我先输入的y。 vs.x=x1-1;vs.y=y1-1; vd.x=x2-1;vd.y=y2-1; bfs(vs,vd); } return 0; }
相关文章推荐
- HDU 1728 逃离迷宫(DFS||BFS)
- hdu1728 逃离迷宫 bfs
- HDU 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫 bfs
- HDU 1728 逃离迷宫 (bfs)
- HDU 1728 逃离迷宫(BFS)
- HDU 1728 逃离迷宫 BFS
- HDU 1728 逃离迷宫 BFS
- hdu 1728 逃离迷宫 bfs记转向
- hdu 1728 逃离迷宫 bfs
- HDU-1728-逃离迷宫(BFS)
- HDU 1728 逃离迷宫【BFS】
- HDU-1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(bfs)
- hdu 1728 逃离迷宫(bfs)
- HDU 1728逃离迷宫(DFS或者BFS)
- HDU 1728逃离迷宫(DFS或者BFS)
- hdu 1728 逃离迷宫 bfs记步数
- hdu 1728 逃离迷宫 (论DFS思想在BFS中的应用)
- hdu 1728 逃离迷宫(BFS 有 限制条件,陷阱比较多)