USACO2.4.2 穿越栅栏
2016-07-15 18:14
260 查看
【问题描述】
FJ搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口,并且从迷宫中的任意一点都能找到一条走出迷宫的路。给定迷宫的宽 W 及长 H 和这个迷宫,然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的最少步数。
【输入格式】
第一行: W和H(用空格隔开)
第二行至第2*H+1行: 每行2*W+1个字符表示迷宫
【输出格式】
输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。
【输入样例】
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
【输出样例】
9
【数据范围】
1 <= W <= 38
1 <= H <= 100
输入有n*2+1行,每一行用gets输入一串字符,然后遍历‘-’和‘|’。
每遍历到一个就给图架墙。构建完迷宫后枚举找两个出口,多源BFS算出距离。
FJ搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口,并且从迷宫中的任意一点都能找到一条走出迷宫的路。给定迷宫的宽 W 及长 H 和这个迷宫,然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的最少步数。
【输入格式】
第一行: W和H(用空格隔开)
第二行至第2*H+1行: 每行2*W+1个字符表示迷宫
【输出格式】
输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。
【输入样例】
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
【输出样例】
9
【数据范围】
1 <= W <= 38
1 <= H <= 100
输入有n*2+1行,每一行用gets输入一串字符,然后遍历‘-’和‘|’。
每遍历到一个就给图架墙。构建完迷宫后枚举找两个出口,多源BFS算出距离。
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 305 using namespace std; struct data { int a,b; }q[maxn*maxn*maxn]; int n,m,t=1,front,rear,ans=0; int x[5],y[5]; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; //右,下,左,上 int mat[maxn][maxn][4]={0}; //右,下,左,上 注意对应dx和dy int vis[maxn][maxn]={0},d[maxn][maxn]={0}; char s[200]; void in() { scanf("%d%d\n",&m,&n); for(int i=1;i<=n*2+1;i++) { gets(s); for(int j=0;j<2*m+1;j++) { //架墙 if(s[j]=='-') { mat[i/2+1][j/2+1][3]=1; mat[i/2][j/2+1][1]=1; } if(s[j]=='|') { mat[i/2][j/2][0]=1; mat[i/2][j/2+1][2]=1; } } } //找出口 for(int j=1;j<=m;j++) { if(!mat[1][j][3]) x[t]=1,y[t++]=j; if(!mat [j][1]) x[t]=n,y[t++]=j; } for(int i=1;i<=n;i++) { if(!mat[i][1][2]) x[t]=i,y[t++]=1; if(!mat[i][m][0]) x[t]=i,y[t++]=m; } } void bfs() { front=rear=1; for(int i=1;i<=2;i++) { printf("%d %d\n",x[i],y[i]); q[rear++]=(data){x[i],y[i]}; d[x[i]][y[i]]=1; vis[x[i]][y[i]]=1; } while(front!=rear) { data t=q[front++]; for(int i=0;i<4;i++) { int xx=t.a,yy=t.b; int nx=xx+dx[i],ny=yy+dy[i]; if(mat[xx][yy][i]) continue; if(nx<1||ny<1||nx>n||ny>m) continue; if(vis[nx][ny]) continue; vis[nx][ny]=1; d[nx][ny]=d[xx][yy]+1; q[rear++]=(data){nx,ny}; } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); in(); bfs(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans=max(ans,d[i][j]); printf("%d",ans); return 0; }
相关文章推荐
- 集合(Collection,set,list,map)
- puppet dead but pid file exists
- 配置通用hive的环境变量(.hiverc)
- Windows编程下, ANSI、UTF8、Unicode之间的转换
- java中DTO clone
- 【BZOJ2039】[2009国家集训队]employ人员雇佣【最小割】
- 三分钟了解Activity工作流
- java的动态代理机制详解
- 播放本地音频
- RAM和ROM容量计算
- Kafka设计解析(二)- Kafka High Availability (上)
- Android后台保活实践总结:即时通讯应用无法根治的“顽疾”
- vue-cli创建项目
- 我们连站都站不好--从Taylor Swift的脖子说起
- c#编译 技巧
- 关于Multimap的遍历和删除
- Spring中的FactoryBean及Mybatis中Mapper生成原理解析
- sqlite数据库自动升级设计
- 倒序排列
- Spring MVC 教程,快速入门,深入分析