【USACO 2.4】Overfencing(bfs最短路)

H行W列的迷宫,用2*H+1行的字符串表示,每行最多有2*W+1个字符,省略每行后面的空格。迷宫的边界上有且仅有两个出口,求每个点出发到出口的最短路。

+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+

以每个出口为起点bfs,需要注意的是,最后的距离是(d+1)/2。

/*
TASK:maze1
URL:http://train.usaco.org/usacoprob2?a=iHr5iXglQfJ&S=maze1
LANG:C++
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 305
using namespace std;
int n,m,dx[]={,,,-},dy[]={,,-,},dis[N][N],ans,vis[N][N];
char c[N][N];
struct node {
int x,y,d;
};
queue<node>q;
void bfs(){
for(int i=;i<=*m;i++)
for(int j=;j<=*n;j++)
if(!i||i==*m||!j||j==*n)
if(!c[i][j]||c[i][j]==' '){
memset(vis,,sizeof vis);
q.push((node){i,j,});
while(!q.empty()){
node t=q.front();
q.pop();
int x=t.x,y=t.y,d=t.d;
if(vis[x][y]||x<||y<||x>*m+||y>*n+||c[x][y]&&c[x][y]!=' ')continue;
vis[x][y]=;
dis[x][y]=min(dis[x][y],d);
for(int i=;i<=;i++)
q.push((node){x+dx[i],y+dy[i],d+});
}
}
}
int main(){
freopen("maze1.in","r",stdin);
freopen("maze1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m*;i++)
scanf("%*c%[^\n]",c[i]);
memset(dis,0x3f3f3f3f,sizeof dis);
bfs();
for(int i=;i<=*m;i+=)
for(int j=;j<=*n;j+=)
ans=max(ans,dis[i][j]);
printf("%d\n",ans+>>);
return ;
}

  

上一篇:刚安装的ios app 会带有教你功能使用的特效说明 做法


下一篇:十大关系数据库SQL注入工具一览