题目链接:http://poj.org/problem?id=3083
题意:给出一个迷宫,s为起点,e为终点,‘#’表示墙,‘.’表示路,求从s沿着左边墙走,沿着右边墙走,任意方式走,到达e所需要的步数。
前两种方式用Dfs,重点在于方向比较难确定。
如果沿着左边墙走,方向为←↑→↓
如果沿着右边墙走,方向为→↑←↓
一开始按照题意直接打了两个Dfs,代码巨长,A了之后,在网上看了一下别人的代码,参照改了一下Dfs部分的代码。
之后求最短路径,用的是Bfs,这个相对来说比较容易吧。
虽然这道题需要Dfs和Bfs,但是感觉二者之间并没有什么关系..
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; const int INF=0x3f3f3f3f; const int maxn=55; int T,n,m; char map[maxn][maxn]; bool vis[maxn][maxn]; int sx,sy,ex,ey; int leftStep,rightStep,shortStep; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; int dl[][2]={{0,-1},{-1,0},{0,1},{1,0}}; int dr[][2]={{0,1},{-1,0},{0,-1},{1,0}}; struct node{ int x,y; int step; }; bool Dfs_Judge(int x,int y){ if(x<0||x>=n||y<0||y>=m) return false; if(map[x][y]=='#') return false; return true; } int Dfs(int x,int y,int direction,int step,int dir[][2]){ for(int i=0;i<4;i++){ int j=((direction+3)%4+i)%4; int tmpx=x+dir[j][0]; int tmpy=y+dir[j][1]; if(tmpx==ex&&tmpy==ey) return step+1; if(Dfs_Judge(tmpx,tmpy)){ return Dfs(tmpx,tmpy,j,step+1,dir); } } return -1; } bool Bfs_Judge(int x,int y){ if(x<0||x>=n||y<0||y>=m) return false; if(map[x][y]=='#') return false; if(vis[x][y]) return false; return true; } int Bfs(){ memset(vis,0,sizeof(vis)); queue<node>Q; node s,tmp; s.x=sx,s.y=sy,s.step=1; vis[s.x][s.y]=1; Q.push(s); while(!Q.empty()){ s=Q.front(); Q.pop(); if(s.x==ex&&s.y==ey){ return s.step; } for(int i=0;i<4;i++){ tmp.x=s.x+dx[i]; tmp.y=s.y+dy[i]; tmp.step=s.step+1; if(Bfs_Judge(tmp.x,tmp.y)){ vis[tmp.x][tmp.y]=1; Q.push(tmp); } } } return -1; } int main(){ #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif scanf("%d",&T); while(T--){ scanf("%d%d",&m,&n); for(int i=0;i<n;i++) scanf("%s",map[i]); int leftDir,rightDir; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(map[i][j]=='S'){ sx=i,sy=j; if(i==0) {leftDir=3,rightDir=3;} if(j==0) {leftDir=2,rightDir=0;} if(i==n-1) {leftDir=1,rightDir=1;} if(j==m-1) {leftDir=0,rightDir=2;} } if(map[i][j]=='E'){ ex=i,ey=j; } } } leftStep=Dfs(sx,sy,leftDir,1,dl); rightStep=Dfs(sx,sy,rightDir,1,dr); shortStep=Bfs(); printf("%d %d %d\n",leftStep,rightStep,shortStep); } return 0; }