usaco Overfencing 穿越栅栏(BFS)
Overfencing 穿越栅栏
农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出
了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中
的任意一点找到一条走出迷宫的路.
给定迷宫的宽 W(1<=W<=38)及长 H(1<=H<=100).
2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫.然后计算从迷宫中最“糟糕”的那一
个点走出迷宫所需的步数.(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步
数)当然了,牛们只会水平或垂直地在 X 或 Y 轴上移动,他们从来不走对角线.每移动到一个新的方
格算作一步(包括移出迷宫的那一步)
这是一个 W=5,H=3 的迷宫:
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
如上图的例子,栅栏的柱子只出现在奇数行或奇数列.每个迷宫只有两个出口.
PROGRAM NAME: maze1
INPUT FORMAT
第一行: W 和 H(用空格隔开)
第二行至第 2*H+2 行: 每行 2*W+1 个字符表示迷宫
SAMPLE INPUT (file maze1.in)
5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
OUTPUT FORMAT
输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数.
SAMPLE OUTPUT (file maze1.out)
9
把两个门加到队列里一起bfs用setup记录达到某点的步数(顺便可以当vis数组使用防止重走)最后到达那个最远点的步数就是要求的答案。我在判断到门的时候把门转为迷宫中的格子然后加入队列并使那点的setup为1.
/*
ID: jinbo wu
TASK:maze1
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
char a[250][100];
int dir[4][2]={2,0,0,2,-2,0,0,-2};
int ex[2],ey[2];
int w,h;
struct node
{int x,y;
}temp;
int setup[250][100];
bool can(int x,int y,int c,int d)
{if(c>=0&&c<2*h+1&&d>=0&&d<2*w+1&&a[x][y]==' ')return true;return false;
}
queue<node> q;
int bfs()
{node t1,t2;int ans=0;while(!q.empty()){t2=q.front();q.pop();if(ans<setup[t2.x][t2.y])ans=setup[t2.x][t2.y];for(int i=0;i<4;i++){t1.x=t2.x+dir[i][0];t1.y=t2.y+dir[i][1];int xx=t2.x+dir[i][0]/2;int yy=t2.y+dir[i][1]/2;if(can(xx,yy,t1.x,t1.y)&&!setup[t1.x][t1.y]){setup[t1.x][t1.y]=setup[t2.x][t2.y]+1;q.push(t1);}}}return ans;}
int main()
{freopen("maze1.in","r",stdin);freopen("maze1.out","w",stdout);cin>>w>>h;int l=0;getchar();for(int i=0;i<2*h+1;i++){for(int j=0;j<2*w+1;j++){scanf("%c",&a[i][j]);if(((i==0||i==2*h)||(j==0||j==2*w))&&(a[i][j]==' ')){int dx=i,dy=j;if(i==0) dx+=1;if(j==0) dy+=1;if(i==2*h) dx-=1;if(j==2*w) dy-=1;temp.x=dx,temp.y=dy;setup[dx][dy]=1;q.push(temp);}}getchar();}int ans=bfs();cout<<ans<<endl;
}
usaco Overfencing 穿越栅栏(BFS)相关推荐
- 蓝桥杯 15决赛 B4 穿越雷区(bfs)
蓝桥杯 15决赛 B4 穿越雷区(bfs) 标题:穿越雷区 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全 ...
- luogu P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个"完美的"迷宫: ...
- 穿越栅栏 Overfencing
https://www.luogu.org/problemnew/show/P1519 题解:二进制状态压缩+BFS 注意:洛谷上数据以'\r\n'结尾,并非'\n' /* *@Author: STZ ...
- [蓝桥杯2015决赛]穿越雷区-bfs
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- 蓝桥杯 穿越雷区(bfs)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- 蓝桥杯之穿越雷区 BFS
本题为2015年第六届蓝桥杯C语言A组试题,第4题. 考点:广度优先搜索(BFS) 广搜一般用来解决"最短""最少"问题,需用到队列. 题目描述 标题:穿越雷区 ...
- 标题 穿越雷区 java_6届国赛java试题 4: 穿越雷区
穿越雷区(BFS) X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路 ...
- 洛谷P2181答案C语言,洛谷P2181 对角线(组合数)
题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. 输出格式: 第一行输出交点数 ...
- 【读书】马克·李维《自由的孩子》摘录
没有任何的牢笼可禁锢我的思想,所有的情愫都可以穿越栅栏飞向远方. --马克·李维 <自由的孩子> 这是马克·李维的<自由的孩子>中让我感触最深的话,这场青春的挽歌,关乎友情.关 ...
最新文章
- DotNet 项目开发文档的自动生成和相关工具的使用
- ora-39142,ora-39001,ora-39000
- c语言推箱子文字说明,c语言 推箱子(C language Sokoban).doc
- SPI接口比IIC速度快的理解
- 3D建模如何学习,小白6个月入门工作?3D建模要学多久才能接外包私活?
- python学习方法_十二种学习Python的方法
- aqs clh java_Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁
- 24个基本指标精粹讲解(22)--ADR
- fix协议封装挑战-数据有效性校验
- Techwiz LCD 1D:SRF的颜色分析
- Word 2016怎么安装公式编辑器
- 智慧仓储:打造仓储管理一张图
- unordered_set使用介绍
- Unity程序框架总结归置系列(4)——mono模块
- PROTEUS中的复位电路
- html js怎么访问url地址,HTML URL地址解析
- java实现日记本功能
- D. Divide(math)[2021 ECNU Campus Invitational Contest]
- 微软云计算官方中文网站上线啦
- Detectron2 API 之 config | 十五
热门文章
- Mysql,SqlServer,Oracle主键自动增长的设置
- cannot find package “github.com/json-iterator/go“cannot find package “github.com/modern-go/reflect2“
- LeetCode简单题之按奇偶排序数组 II
- LeetCode简单题之数组拆分 I
- LeetCode简单题之学生出勤记录 I
- 几何深度学习(Geometric Deep Learning)技术
- LLVM数据流分析的理论
- CVPR2020:端到端学习三维点云的局部多视图描述符
- 【CV】吴恩达机器学习课程笔记第17章
- python 把集合转成字典的方法