知道了这个走法,能做了,但是想一想你面朝不同方向的时候前后左右都不一样啊,这可怎么整?我感觉这是有规律的,但是我没找,没有必要吧,用个笨方法(如下),1、2、3、4 的表示一下,在判断一下,也就多个几十行代码的事,而且大半都是复制粘贴改改数据,但是很重要的一点:一点都不能错!!!
代码如下:
#include
#include
#include
using namespace std;
char p[50][50];
int vis[50][50];
int n,m,si,sj;
int dxy[5][2]={{0,0},{-1,0},{0,-1},{1,0},{0,1}};
//上 左 下
int tl,tr,tt;
int searchl(int x,int y,int pre,int t)
{
tl++;
int xx,yy;
int d[5];//先确定方向 左前右后 顺序
if(pre==1)
{
d[1]=2; d[2]=1; d[3]=4; d[4]=3;
}
else if(pre==2)
{
d[1]=3; d[2]=2; d[3]=1; d[4]=4;
}
else if(pre==3)
{
d[1]=4; d[2]=3; d[3]=2; d[4]=1;
}
else if(pre==4)
{
d[1]=1; d[2]=4; d[3]=3; d[4]=2;
}
for(int i=1;i<=4;i++)
{
xx=x+dxy[d[i]][0];
yy=y+dxy[d[i]][1];
if(p[xx][yy]=='E')
{
return t+1;
}
if(p[xx][yy]=='.')//如果有路 走,且 break
{
searchl(xx,yy,d[i],t+1);
break;
}
}
}
int searchr(int x,int y,int pre,int t)
{
tr++;
int xx,yy;
int d[5];//先确定方向 右前左后 顺序
if(pre==1)
{
d[1]=4; d[2]=1; d[3]=2; d[4]=3;
}
else if(pre==2)
{
d[1]=1; d[2]=2; d[3]=3; d[4]=4;
}
else if(pre==3)
{
d[1]=2; d[2]=3; d[3]=4; d[4]=1;
}
else if(pre==4)
{
d[1]=3; d[2]=4; d[3]=1; d[4]=2;
}
for(int i=1;i<=4;i++)
{
xx=x+dxy[d[i]][0];
yy=y+dxy[d[i]][1];
if(p[xx][yy]=='E')
{
return t+1;
}
if(p[xx][yy]=='.')//如果有路 走,且 break
{
searchr(xx,yy,d[i],t+1);
break;
}
}
}
struct node
{
int x,y,t;
};
int ok1(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)
return 1;
return 0;
}
int ok2(int x,int y)
{
if(x>1&&x1&&y>t;
while(t--)
{
cin>>m>>n;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>p[i][j];
if(p[i][j]=='S')
{
si=i;
sj=j;
}
}
}
int d=0;//从起点开始的方向
if(si==1)
d=3;
else if(si==n)
d=1;
else if(sj==1)
d=4;
else if(sj==m)
d=2;
int x=si+dxy[d][0];
int y=sj+dxy[d][1];
tl=2;
tr=2;
int left=searchl(x,y,d,2);
int right=searchr(x,y,d,2);
int mid=ioan(si,sj);
cout<