bfs+dfs
题目要求从起点走到终点,优先左拐需要多少步,优先往右拐需要多少步,最少需要多少步三个结果
需要注意的就是左右不能拐时向其他方向拐的先后顺序
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int m,n,x1,x2,y1,y2,cnt,lstep,rstep,ans;
char map[50][50];
int move[4][2]={1,0,-1,0,0,1,0,-1};
int used[50][50];
struct node
{
int x,y,step;
};
int bok(int x,int y)
{
if(x<0 || y<0 || x>=m || y>=n)return 0;
if(used[x][y])return 0;
if(map[x][y]=='#')return 0;
return 1;
}
int ok(int x,int y)
{
if(x<0 || y<0 || x>=m || y>=n)return 0;
if(map[x][y]=='#')return 0;
if(cnt)return 0;
return 1;
}
void ldfs(int x,int y,int s)//深搜从左边走的步数
{
if(cnt)return;
lstep++;
if(x==x2 && y==y2)
{
cnt=1;
return;
}
if(s==0 || s==2)
{
if(ok(x,y-1))
ldfs(x,y-1,1);
if(ok(x-1,y))
ldfs(x-1,y,2);
if(ok(x,y+1))
ldfs(x,y+1,3);
if(ok(x+1,y))
ldfs(x+1,y,4);
}
if(s==1)
{
if(ok(x+1,y))
ldfs(x+1,y,4);
if(ok(x,y-1))
ldfs(x,y-1,1);
if(ok(x-1,y))
ldfs(x-1,y,2);
if(ok(x,y+1))
ldfs(x,y+1,3);
}
if(s==3)
{
if(ok(x-1,y))
ldfs(x-1,y,2);
if(ok(x,y+1))
ldfs(x,y+1,3);
if(ok(x+1,y))
ldfs(x+1,y,4);
if(ok(x,y-1))
ldfs(x,y-1,1);
}
if(s==4)
{
if(ok(x,y+1))
ldfs(x,y+1,3);
if(ok(x+1,y))
ldfs(x+1,y,4);
if(ok(x,y-1))
ldfs(x,y-1,1);
if(ok(x-1,y))
ldfs(x-1,y,2);
}
return;
}
void rdfs(int x,int y,int s)//深搜从右边走的步数
{
if(cnt)return ;
rstep++;
if(x==x2 && y==y2)
{
cnt=1;
return;
}
if(s==0 || s==2)
{
if(ok(x,y+1))
rdfs(x,y+1,1);
if(ok(x-1,y))
rdfs(x-1,y,2);
if(ok(x,y-1))
rdfs(x,y-1,3);
if(ok(x+1,y))
rdfs(x+1,y,4);
}
if(s==1)
{
if(ok(x+1,y))
rdfs(x+1,y,4);
if(ok(x,y+1))
rdfs(x,y+1,1);
if(ok(x-1,y))
rdfs(x-1,y,2);
if(ok(x,y-1))
rdfs(x,y-1,3);
}
if(s==3)
{
if(ok(x-1,y))
rdfs(x-1,y,2);
if(ok(x,y-1))
rdfs(x,y-1,3);
if(ok(x+1,y))
rdfs(x+1,y,4);
if(ok(x,y+1))
rdfs(x,y+1,1);
}
if(s==4)
{
if(ok(x,y-1))
rdfs(x,y-1,3);
if(ok(x+1,y))
rdfs(x+1,y,4);
if(ok(x,y+1))
rdfs(x,y+1,1);
if(ok(x-1,y))
rdfs(x-1,y,2);
}
return;
}
int bfs(int x,int y)//广搜到终点的最少步数
{
int i;
queue<node>q;
node now,next;
now.x=x;
now.y=y;
now.step=0;
used[x][y]=1;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(i=0;i<4;i++)
{
next.x=now.x+move[i][0];
next.y=now.y+move[i][1];
next.step=now.step+1;
if(bok(next.x,next.y))
{
used[next.x][next.y]=1;
q.push(next);
if(next.x==x2 && next.y==y2)return next.step;
}
}
}
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
scanf("%s",map[i]);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j]=='S')
{
x1=i;
y1=j;
}
if(map[i][j]=='E')
{
x2=i;
y2=j;
}
}
}
cnt=lstep=0;
ldfs(x1,y1,0);
cnt=rstep=0;
rdfs(x1,y1,0);
memset(used,0,sizeof(used));
ans=bfs(x1,y1);
printf("%d %d %d\n",lstep,rstep,ans+1);
}
return 0;
}