从入口到出口,墙需要的时间不一样
BFS先是用了for循环写,然而超时
所以在网上找到了用queue写的BFS,并不理解为什么我的超时
#include <iostream>
#include <stdio.h>
using namespacestd;
char map[305][305];
int turn[4][2]={1,0,-1,0,0,1,0,-1};
int m,n,endx,endy,beginx,beginy,ok,tim,flag[305][305],f;
int check()
{
for(int i=0;i<m;i++)
for(int j=0;i<n;j++)
{
if(map[i][j]=='E'||map[i][j]=='B')
{
if(flag[i][j]==0)
return1;
}
}
return0;
}
void BFS(int x,int y,int t)
{
if(map[x][y]=='T')
{
if(t<tim)
tim=t;
return;
}
if(check()==0)
return;
flag[x][y]=1;
int xx,yy;
for(int i=0;i<4;i++)
{
xx=x+turn[i][0];
yy=y+turn[i][1];
//printf("xx=%d yy=%d c=%c ",xx,yy,map[xx][yy]);
if(xx<0||xx>=m||yy<0||yy>=n||flag[xx][yy]==1)
continue;
if(map[xx][yy]=='B')
BFS(xx,yy,t+2);
elseif(map[xx][yy]=='E'||map[xx][yy]=='T')
BFS(xx,yy,t+1);
}
flag[x][y]=0;
}
int main()
{
while(scanf("%d %d",&m,&n))
{
getchar();
if(m==0&&n==0)
break;
for(int i=0;i<m;i++)
{
scanf("%s",map[i]);
for(int j=0;j<n;j++)
{
if(map[i][j]=='Y')
{
beginx=i;
beginy=j;
}
}
}
f=0;
tim=1000000;
memset(flag,0,sizeof(flag));
BFS(beginx,beginy,0);
if(tim==1000000)
printf("-1\n");
else
cout <<tim<<endl;
}
return0;
}
*****************分割线*****************
#include<iostream>
#include<cstdio>
#include<queue>
using namespacestd;
struct point
{
int x,y;
int steps;
};
char map[301][301];
int visit[301][301],b[4][2]={-1,0,1,0,0,-1,0,1};
int bfs(point start,point end,int n,int m)
{
int x,y,i;
point e;
queue <point> Q;
Q.push(start);
visit[start.x][start.y]=1;
while(!Q.empty())
{
e=Q.front();
if(e.x==end.x && e.y==end.y)
break;
Q.pop();
if(map[e.x][e.y]=='B')
{
e.steps++;
map[e.x][e.y]='E';
Q.push(e);
continue;
}
for(i=0;i<4;i++)
{
x=e.x+b[i][0]; y=e.y+b[i][1];
if(x>=0 && x<n && y>=0 && y<m && !visit[x][y])
{
if(map[x][y]=='E' ||map[x][y]=='B' ||map[x][y]=='T')
{
point ee={x,y,e.steps+1};
Q.push(ee);
visit[x][y]=1;
}
}
}
}
if(!Q.empty())return e.steps;
return -1;
}
int main()
{
int m,n,i,j;
point start,end;
while(scanf("%d%d",&n,&m) && n+m)
{
for(i=0;i<n;i++)
scanf("%s",map[i]);
memset(visit,0,sizeof(visit));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(map[i][j]=='Y')
{
start.x=i; start.y=j; start.steps=0;
}
elseif(map[i][j]=='T')
{
end.x=i; end.y=j; end.steps=0;
}
printf("%d\n",bfs(start,end,n,m));
}
return0;
}