没想到BFS还能这么玩!!!之前只知道bfs求到终点的最短路,没想到也可以求起点到地图任意点的最短路(打表的感觉),两次bfs,分别求出Y,M到地图任意点的步数,再遍历图中的每一个'@',比较Y,M到每个'@'点的距离和,输出最小值*11。62ms.
我当时就想到了分别以Y,M为起点,每次调用bfs求出到'@'的距离,找出最小值,这里有n个@,就要调用2*n次bfs,提交超时,而第一个方法,总共就调用2次。
#include
#include
#include
#include
using namespace std;
int f[4][2]={0,1,1,0,-1,0,0,-1};
int n,m;
struct node{
int x,y;
};
int x1,x2,y1,y2;
char mat[205][205];
int vis[205][205][2];//记录走过(i,j)点没,[2]是两个起点,下同
int dp[205][205][2];//记录起点到(i,j)的总步数,打表
int bfs(int a,int b,int c)
{
queueq;
node s,t;
s.x=a;
s.y=b;
vis[a][b][c]=1;
dp[a][b][c]=0;
q.push(s);
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
s.x=t.x+f[i][0];
s.y=t.y+f[i][1];
if(vis[s.x][s.y][c]||s.x>=n||s.y>=m||s.x<0||s.y<0||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y][c]=1;//经过此点
dp[s.x][s.y][c]=dp[t.x][t.y][c]+1;//记录步数
q.push(s);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
getchar();
int num=0;
for(int i=0;i
最后附上我的超时代码
#include
#include
#include
#include
using namespace std;
int f[4][2]={0,1,1,0,-1,0,0,-1};
int n,m;
struct node{
int x,y;
int temp;
};
struct point{
int x,y;
}poi[500];
int x1,x2,y1,y2;
char mat[205][205];
int vis[205][205];
int bfs(int a,int b,point k)
{
memset(vis,0,sizeof(vis));
queueq;
node s,t;
s.x=a;
s.y=b;
s.temp=0;
vis[a][b]=1;
q.push(s);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x==k.x&&t.y==k.y)
{
return t.temp;
}
for(int i=0;i<4;i++)
{
s.x=t.x+f[i][0];
s.y=t.y+f[i][1];
s.temp=t.temp+1;
if(vis[s.x][s.y]||s.x>=n||s.y>=m||s.x<0||s.y<0||mat[s.x][s.y]=='#')
continue;
vis[s.x][s.y]=1;
q.push(s);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
getchar();
int num=0;
for(int i=0;i