标签:
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1464 Accepted Submission(s): 423
第一次做这种BFS,学了一些东西。主要是参考了syhjh的思路和方法。
总结一下吧:
和普通的宽搜不相同的地方,1,两个目标,2,有步数限制(其实就是个优化咯)
怎么写呢? 结构体中不仅有x,y坐标,time步数,还要有这连个目标是否找到,一个一个的找,宽搜的时候把前一个状态复制过来,结束宽搜的语句就很好写了。然后就是判环(就是不走重复路,mark数组可以4维也可以二维),
然后还有一点很重要,就是样例中的第三个样例,说明了小明不能穿过D,E,所以在初始化的时候就记录下这两个点,然后变为不可走的点。
最后做一下BFS
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define MAXN 111 #define inf 1<<30 struct Node { int x,y; int time; bool tag1,tag2; }; int n,m,time,ans; Node st,ed1,ed2; char maps[MAXN][MAXN]; bool mark[MAXN][MAXN][2][2]; int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; bool Judge(Node &p) { int x=p.x,y=p.y; if(x==ed1.x) { for(int i=y+1; i<=m; i++) { if(ed1.y==i) { p.tag1=true; break; } else if(maps[x][i]==‘X‘)break; } for(int i=y-1; i>=1; i--) { if(ed1.y==i) { p.tag1=true; break; } else if(maps[x][i]==‘X‘)break; } } if(x==ed2.x) { for(int i=y+1; i<=m; i++) { if(ed2.y==i) { p.tag2=true; break; } else if(maps[x][i]==‘X‘)break; } for(int i=y-1; i>=1; i--) { if(ed2.y==i) { p.tag2=true; break; } else if(maps[x][i]==‘X‘)break; } } if(y==ed1.y) { for(int i=x+1; i<=n; i++) { if(ed1.x==i) { p.tag1=true; break; } else if(maps[i][y]==‘X‘)break; } for(int i=x-1; i>=1; i--) { if(ed1.x==i) { p.tag1=true; break; } else if(maps[i][y]==‘X‘)break; } } if(y==ed2.y) { for(int i=x+1; i<=n; i++) { if(ed2.x==i) { p.tag2=true; break; } else if(maps[i][y]==‘X‘)break; } for(int i=x-1; i>=1; i--) { if(ed2.x==i) { p.tag2=true; break; } else if(maps[i][y]==‘X‘)break; } } if(p.tag1&&p.tag2)return true; return false; } void bfs() { memset(mark,false,sizeof(mark)); queue<Node>Q; Node p,q; mark[st.x][st.y][st.tag1][st.tag2]=true; Q.push(st); while(!Q.empty()) { p=Q.front(); Q.pop(); if(Judge(p))ans=min(ans,p.time); if(p.time>time)continue; ///you hua for(int i=0; i<4; i++) { q=p; q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; if(q.x<1||q.x>n||q.y<1||q.y>m||maps[q.x][q.y]==‘X‘) continue; if(!mark[q.x][q.y][q.tag1][q.tag2]) { mark[q.x][q.y][q.tag1][q.tag2]=true; q.time++; Q.push(q); } } } } int main() { int _case,t=1; scanf("%d",&_case); while(_case--) { scanf("%d%d%d",&n,&m,&time); for(int i=1; i<=n; i++) { scanf("%s",maps[i]+1); for(int j=1; j<=m; j++) { if(maps[i][j]==‘S‘) { st.x=i,st.y=j,st.tag1=st.tag2=false,st.time=0; } else if(maps[i][j]==‘E‘) { ed1.x=i,ed1.y=j; maps[i][j]=‘X‘; } else if(maps[i][j]==‘D‘) { maps[i][j]=‘X‘; ed2.x=i,ed2.y=j; } } } ans=inf; bfs(); printf("Case %d:\n",t++); if(ans<=time) { printf("%d\n",ans); } else puts("-1"); } return 0; }
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5790234.html