题目大意:(别人总结的~~)
给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走
先输出左转优先时(贴着左边的墙走),从S到E的步数
再输出右转优先时(贴着右边的墙走),从S到E的步数
最后输出S到E的最短步数
解题思路:
用BFS走迷宫求出,求出最短路~~这个简单
然后拿dfs求出路径的步数,这个有点麻烦的是优先走的方向~~
还是copy下别人的
单就沿着左走看一下:
当前方向 优先的检索顺序
↑ : ← ↑ → ↓
→ : ↑ → ↓ ←
↓ : → ↓ ← ↑
← : ↓ ← ↑ →
14297033 h123120 3083 Accepted 300K 0MS C++ 3451B 2015-06-15 20:02:45
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=100+10;
int sx,sy,ex,ey,dist;
int w,h;
char maps[maxn][maxn];
int dr[]={0,1,0,-1};//ÉÏÓÒÏÂ×ó˳ʱÕë
int dc[]={-1,0,1,0};
int r_order[]={1,0,3,2};
typedef struct Node
{
int r;//×ø±ê
int c;
int d;//¾àÀë
}node;
int bfs()
{
int vis[maxn][maxn];
memset(vis,0,sizeof(vis));
node u;
int cnt=0;
u.r=sx;u.c=sy;u.d=1;
vis[sx][sy]=1;
queue<node> q;
q.push(u);
while(!q.empty())
{
cnt++;
node u=q.front();
q.pop();
if(u.r==ex&&u.c==ey) {return u.d;}
for(int i=0;i<4;i++)
{
node v;
v.r=u.r+dr[i];
v.c=u.c+dc[i];
v.d=u.d+1;
if(v.r < 0 || v.r>= h || v.c< 0 || v.c >= w) continue;
if(maps[v.r][v.c]!='#'&&maps[v.r][v.c]!='S'&&!vis[v.r][v.c])
{
vis[v.r][v.c]=1;
q.push(v);
}
}
}
}
void dfs_L(int x,int y,int dir)
{
for(int i=0;i<4;i++ )
{
int j=(i+dir+3)%4;
int newx=x+dr[j];
int newy=y+dc[j];
if(newx < 0 || newy < 0 || newx > h || newy > w) continue;
// if(maps[newx][newx] == '#') continue;
if(maps[newx][newy]=='E') {dist++;return;}
else if(maps[newx][newy]=='.')
{
dist++;
dfs_L(newx,newy,j);
return ;
}
}
return ;
}
void dfs_R(int x,int y,int dir)
{
for(int i=0;i<4;i++ )
{
int j=(r_order[i]+dir)%4;
int newx=x+dr[j];
int newy=y+dc[j];
if(newx < 0 || newy < 0 || newx > h || newy > w) continue;
//if(maps[newx][newx] == '#') continue;
if(maps[newx][newy]=='E') {dist++;return;}
else if(maps[newx][newy]=='.')
{
dist++;
dfs_R(newx,newy,j);
return ;
}
}
return ;
}
int main()
{
// freopen("1.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
cin>>w>>h;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
cin>>maps[i][j];
if(maps[i][j]=='S') {sx=i;sy=j;}
if(maps[i][j]=='E') {ex=i;ey=j;}
}
int dir;
if(sx==0) dir=1;
else if(sy==0) dir=2;
else if(sx==h-1) dir=0;
else if(sy==w-1) dir=3;
dist=1;
dfs_R(sx,sy,dir);
cout<<dist<<" ";
dist=1;
dfs_L(sx,sy,dir);
cout<<dist<<" ";
cout<<bfs()<<endl;
}
return 0;
}