POJ3083BFS

这题做得还行。0MS通过。我觉得就最短路径的时候需要用到算法bfs。

其他两个其实就是一个计算机模拟的而已,简单的数学思维就行了。反正就是两种方法走,第一种走是贴着左墙走,第二种是贴右墙,

自己模拟走走就知道有规律可循。

#include<iostream>

#include<queue>
using namespace std;
int lmovex[4]={-1,0,1,0};
int lmovey[4]={0,-1,0,1};
int rmovex[4]={1,0,-1,0};
int rmovey[4]={0,-1,0,1};
struct Node{int x,y;
Node(int _x=0,int _y=0){x=_x;y=_y;}};
const int N=42;
char maze[N][N];
int nx,ny;
int visit[N][N];
Node start;
Node end1;
int a,b,c;
bool inmaze(int x,int y)
{
if(x<1||x>nx||y<1||y>ny||'#'==maze[y][x])
return false;
return true;
}
int leftdfs(int x,int y,int how)
{
int step=1;
int _x=x;
int _y=y;
while(_x!=end1.x||_y!=end1.y)
{
for(int i=0;i<4;i++)
{
if(inmaze(_x+lmovex[(i+how)%4],_y+lmovey[(i+how)%4]))
{
_x=_x+lmovex[(i+how)%4];
_y=_y+lmovey[(i+how)%4];
step++;
how=(i+how-1+4)%4;
break;
}
}
}
return step;
}
int rightdfs(int x,int y,int how)
{
int step=1;
int _x=x;
int _y=y;
while(_x!=end1.x||_y!=end1.y)
{
for(int i=0;i<4;i++)
{
if(inmaze(_x+rmovex[(i-how+4)%4],_y+rmovey[(i-how+4)%4]))
{
_x=_x+rmovex[(i-how+4)%4];
_y=_y+rmovey[(i-how+4)%4];
step++;
how=(5-(i-how))%4;
break;
}
}
}
return step;
}


int bfs(int x,int y)
{
memset(visit,0,sizeof(visit));
queue<Node> que;
que.push(Node(x,y));
visit[y][x]=1;
while(!que.empty())
{
Node t=que.front();
que.pop();
if(t.x==end1.x&&t.y==end1.y)
return visit[t.y][t.x];
for(int i=0;i<4;i++)
{
int _x=t.x+lmovex[i];
int _y=t.y+lmovey[i];
if(inmaze(_x,_y)&&!visit[_y][_x])
{
que.push(Node(_x,_y));
visit[_y][_x]=visit[t.y][t.x]+1;
}
}
}
return 0;
}
int gethow(int x,int y)
{
if(x==1)
return 1;
if(y==1)
return 2;
if(x==nx)
return 3;
return 0;
}
int main()
{
//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
int cases;
scanf("%d",&cases);
while(cases--)
{
scanf("%d%d",&nx,&ny);
for(int i=1;i<=ny;i++)
{
scanf("%s",maze[i]);
for(int j=nx;j>=1;j--)
{
maze[i][j]=maze[i][j-1];
if(maze[i][j]=='S')
start.x=j,start.y=i;
else if(maze[i][j]=='E')
end1.x=j,end1.y=i;
}
}
int c=bfs(start.x,start.y);
int b=rightdfs(start.x,start.y,gethow(start.x,start.y));
int a=leftdfs(start.x,start.y,gethow(start.x,start.y));
printf("%d %d %d\n",a,b,c);
}
system("pause");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值