【USACO2.4.2】穿越栅栏

【问题描述】

  FJ搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口,并且从迷宫中的任意一点都能找到一条走出迷宫的路。给定迷宫的宽 W 及长 H 和这个迷宫,然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的最少步数。

【输入格式】

第一行: W和H(用空格隔开)
第二行至第2*H+1行: 每行2*W+1个字符表示迷宫

【输出格式】

输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。

【输入样例】

5 3
+-+-+-+-+-+
|         |
+-+ +-+ + +
|     | | |
+ +-+-+ + +
| |     | 
+-+ +-+-+-+ 

【输出样例】

9   

算法:棋盘上的BFS(多源)
这个题输入有点恶心,给的不是一个正正规规的迷宫问题的迷宫而给的是迷宫的形状图,所以需要转化,把输入矩阵首行首列的坐标标号为0,那些横纵坐标为基数且自身为空格的点就是一个标准棋盘上的格子。
这里写图片描述
由于是墙障碍,设三元组a[x][y][4] 在=1时表示棋盘上点(x,y)的某个方向上有一堵墙。
又人为规定:
0: 西1: 北2: 东3: 南
再对原矩阵进行扫描标记,转化为普通的墙障碍问题,见【USACO2.4.2简单版本】
但要注意的是,由于没有给出具体的出口坐标,所以要用循环查找,但要注意特殊的点(四个角上的点不管一面无墙还是两面无墙都只存一次)
贴上代码

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 105
using namespace std;
int W,H;
struct node
{
    int x,y;
};
int dx[]={
  0,-1,0,1};
int dy[]={
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值