您的位置:首页 > 其它

poj3083 dfs+bfs搜索迷宫

2017-03-24 18:39 267 查看
#include<stdio.h>
int mov[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int mov1[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int mov2[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
int vis[45][45];
char maze[45][45];
int queue[50*50][3];
int step,sx,sy,ex,ey,h,w,ans,flag=0;
int bfs(int x,int y)
{
int front,rear,x1,x2,y1,y2,i;
memset(vis,0,sizeof(vis));
queue[0][0]=x;
queue[0][1]=y;
queue[0][2]=1;
vis[x][y]=1;
front=-1;
rear=0;
while(front<rear)
{
front++;
x1=queue[front][0];
y1=queue[front][1];
if(x1==ex&&y1==ey)
{
return queue[front][2];
}
for(i=0;i<4;i++)
{
x2=x1+mov[i][0];
y2=y1+mov[i][1];
if(x2<0||x2>=h||y2<0||y2>=w||maze[x2][y2]=='#'||vis[x2][y2])
continue;
step++;
rear++;
queue[rear][0]=x2;
queue[rear][1]=y2;
queue[rear][2]=queue[front][2]+1;
vis[x2][y2]=1;
}
}
}
void dfs1(int x,int y,int s)
{
int i,x1,y1;
if(x==ex&&y==ey)
{
step=s;
flag=1;
return ;
}
ans=(ans+3)%4;
for(i=0;i<4;i++,ans=(ans+1)%4)
{
x1=x+mov1[ans][0];
y1=y+mov1[ans][1];
if(x1<0||x1>=h||y1<0||y1>=w||maze[x1][y1]=='#')
continue;
dfs1(x1,y1,s+1);
if(flag)
break;
}
}
void dfs2(int x,int y,int s)
{
int i,x1,y1;
if(x==ex&&y==ey)
{
step=s;
flag=1;
return ;
}
ans=(ans+3)%4;
for(i=0;i<4;i++,ans=(ans+1)%4)
{
x1=x+mov2[ans][0];
y1=y+mov2[ans][1];
if(x1<0||x1>=h||y1<0||y1>=w||maze[x1][y1]=='#')
continue;
dfs2(x1,y1,s+1);
if(flag)
break;
}
}
int main(void)
{
int i,j,T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&w,&h);
step=0;
for(i=0;i<h;i++)
scanf("%s",maze[i]);
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
if(maze[i][j]=='S')
{
sx=i;
sy=j;
}
if(maze[i][j]=='E')
{
ex=i;
ey=j;
}
}
}
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;
ans=0;
dfs1(sx,sy,1);
printf("%d ",step);
step=0;
memset(vis,0,sizeof(vis));
vis[sx][sy]=1;
ans=0;
dfs2(sx,sy,1);
printf("%d ",step);
printf("%d\n",bfs(sx,sy));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 dfs bfs poj