luogu P1519 穿越栅栏 Overfencing

题目描述

描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:

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

如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。

输入输出格式

输入格式:

 

第一行: W和H(用空格隔开)

第二行至第2 * H + 1行: 每行2 * W + 1个字符表示迷宫

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 
5 3
+-+-+-+-+-+
|         |
+-+ +-+ + +
|     | | |
+ +-+-+ + +
| |     |  
+-+ +-+-+-+
输出样例#1: 
9

说明

翻译来自NOCOW

USACO 2.4

 

刚读完题,感觉挺简单啊,不过研究了一下样例,一脸懵逼,这咋可能?。

经过机房某位 S型 dalao(son)的解读,哦,so ga si nei,吆西吆西,interisting!!!

再次就借花献佛了。

关于的理解题意:

为了便于理解,这里稍微修改一下题目。

奇数行的栅栏(就是由‘+’和‘-’号组成)将其看做一层类似膜结构,一层防护膜(没有厚度),穿越不占距离。

然后看偶数列,这里需要将偶数列和其两侧的‘-’看做一个整体,亦可以理解为忽略偶数列,只考虑奇数列。

这里拿样例图解:

 

结合上图,对题意理解就没什么问题了。

解题剖析:

1.读入含空格矩阵:

想了半天,试了多种输入方法,最终貌似只有getline(:不会用戳我啊)可以用。

但是在输入时,需要多输入一行,并且第一行和第二行会重复,其他没毛病,最后貌似没啥大碍。

    scanf("%d%d",&w,&h);w=w*2+1;h=h*2+1;for(int i=1;i<=h+1;i++)getline(cin,a[i]);

读入是这样的,若有某位dalao明白以上出现的情况,希望讨论区不吝赐教。

2.字符矩阵转换数字矩阵

在这里定义一个int型map数组。

map[i][j]表示走到这个点需要消耗的距离(偶数行为0,奇数行有空地的话消耗为1)

在字符矩阵中[i][j]这个点为栅栏,不能走,将map[i][j]定义为2.

注意前边说到,输入字符时会有一行多余,所以在转换时处理一下。

此部分代码为:

 

    for(int i=2;i<=h+1;i++)for(int j=0;j<w;j++){if(a[i][j]==32){if((i-1)%2==1)map[i-1][j+1]=0;else if((j+1)%2==0)map[i-1][j+1]=1;else map[i-1][j+1]=0;}else map[i-1][j+1]=2;}

 

3.初始化:

ans[i][j]数组记录走到 i,j这个点到出口的最近距离,栅栏处直接定义为-1。

void initial()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)if(map[i][j]==2)ans[i][j]=-1;else ans[i][j]=214748364;
}

 

4.找出出口:

这没啥好说的,四个边找出口(注意经以上过程出口可能为0,可能为1)。

    for(int i=1;i<=w;i++)if(map[1][i]==0||map[1][i]==1)bfs(1,i);for(int i=1;i<=w;i++)if(map[h][i]==0||map[h][i]==1)bfs(h,i);for(int i=1;i<=h;i++)if(map[i][1]==0||map[i][1]==1)bfs(i,1);for(int i=1;i<=h;i++)if(map[i][w]==0||map[i][w]==1)bfs(i,w);

5.大搜索

已经处理处每一格的消耗距离,在搜索时,加上就好啦。

两个出口,需要搜索两边所以搜完注意初始化,bool型数组。

bool vis[N][M];
struct ahah{int x,y;
}str,cur;
queue <ahah> que;
void bfs(int x,int y)
{ans[x][y]=0;vis[x][y]=1;str.x=x;str.y=y;que.push(str);while(!que.empty()){cur=que.front();que.pop() ;for(int i=0;i<4;i++){str.x=cur.x+dx[i];str.y=cur.y+dy[i];if(map[str.x][str.y]!=2&&str.x>=1&&str.x<=h&&str.y>=1&&str.y<=w&&!vis[str.x][str.y]){ans[str.x][str.y]=min(ans[cur.x][cur.y]+map[str.x][str.y],ans[str.x][str.y]);vis[str.x][str.y]=1;que.push(str); }}} memset(vis,0,sizeof(vis));
}

6.找出最大值

将ans数组循环一遍,找出最大值,输出即可。

完整代码:

/*.........................
作者:Manjusaka
时间:2018/7/11
题目:P1519 Overfencing
..........................*/#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue> 
using namespace std;
#define N int(100)
#define M int(210)
int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
string a[N];
int w,h,MAX;
int x[4],y[4],k;
int map[N][M];
int ans[N][M];
void check();
void _scanf();
void initial();
void bfs(int ,int );
void _scanf()
{scanf("%d%d",&w,&h);w=w*2+1;h=h*2+1;for(int i=1;i<=h+1;i++)getline(cin,a[i]);for(int i=2;i<=h+1;i++)for(int j=0;j<w;j++){if(a[i][j]==32){if((i-1)%2==1)map[i-1][j+1]=0;else if((j+1)%2==0)map[i-1][j+1]=1;else map[i-1][j+1]=0;}else map[i-1][j+1]=2;}
//    cout<<"\n";for(int i=1;i<=h;i++){for(int j=1;j<=w;j++){cout<<map[i][j];}cout<<endl;}
    check();
}
void check()
{initial();    for(int i=1;i<=w;i++)if(map[1][i]==0||map[1][i]==1)bfs(1,i);for(int i=1;i<=w;i++)if(map[h][i]==0||map[h][i]==1)bfs(h,i);for(int i=1;i<=h;i++)if(map[i][1]==0||map[i][1]==1)bfs(i,1);for(int i=1;i<=h;i++)if(map[i][w]==0||map[i][w]==1)bfs(i,w);for(int i=1;i<=h;i++){cout<<"\n";for(int j=1;j<=w;j++){printf("%3d",ans[i][j]);}}
}
void initial()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)if(map[i][j]==2)ans[i][j]=-1;else ans[i][j]=214748364;
}
bool vis[N][M];
struct ahah{int x,y;
}str,cur;
queue <ahah> que;
void bfs(int x,int y)
{ans[x][y]=0;vis[x][y]=1;str.x=x;str.y=y;que.push(str);while(!que.empty()){cur=que.front();que.pop() ;for(int i=0;i<4;i++){str.x=cur.x+dx[i];str.y=cur.y+dy[i];if(map[str.x][str.y]!=2&&str.x>=1&&str.x<=h&&str.y>=1&&str.y<=w&&!vis[str.x][str.y]){ans[str.x][str.y]=min(ans[cur.x][cur.y]+map[str.x][str.y],ans[str.x][str.y]);vis[str.x][str.y]=1;que.push(str); }}} memset(vis,0,sizeof(vis));
}
void _printf()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)MAX=max(MAX,ans[i][j]);printf("\n%d",MAX);
}
int main()
{_scanf();_printf();
}

求助大佬!!:

按题目要求来说二位数组开到100*200应该完全可以啊,为什么会比RE,求解释。

 

转载于:https://www.cnblogs.com/rmy020718/p/9297006.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css实现简单的告警提示动画效果

需求&#xff1a;css实现简单的告警提示动画效果&#xff0c;当接收到实时信息的时候&#xff0c;页面弹出告警信息的动画效果<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>css实现告警提示动画</…

程序员的八个级别

2009年4月6日 陈皓 在面试时&#xff0c;你可能会被经常问到“在未来5年&#xff0c;你想干什么&#xff1f;”&#xff0c;这可能是一个比较难回答的问题。在中国&#xff0c;答案一般可能会是Team leader&#xff0c;Manager&#xff0c;或是Architect&#xff0c;Specialist…

一个具有Spring Boot,Spring Security和Stormpath的简单Web应用程序-15分钟

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 更新 &#xff1a;我们最近发布了对…

javafx2_JavaFX 2 GameTutorial第5部分

javafx2介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经有很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#…

史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服…

忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目

Github和Sourceforge上超过600,000个Java项目中的异常处理概述 Java是使用检查异常的少数语言之一。 它们在编译时强制执行&#xff0c;并且需要某种处理。 但是……实践中会发生什么&#xff1f; 大多数开发人员实际上处理任何事情吗&#xff1f; 以及他们如何做到的&#xf…

使用Boxfuse轻松在云中运行Spring Boot应用程序

几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在服务器而不是我自己…

numpy的使用数组的创建2

随机创建了长度为十的数组 获得十以类的随机整数 快速获取数组2乘3维的数组 生成20个1到10之间的数组 通过reshape 将这些数变成二位数组 shape这个方法可以查看数组中的元素是几行几列的 转载于:https://www.cnblogs.com/chenligeng/p/9315339.html

Tabs vs Spaces:如何在Google,Twitter,Mozilla和Pied Piper上编写Java

流行的Java代码样式中最有趣的亮点是什么&#xff1f; 尽管上面有暗示性的形象&#xff0c;我们也不想发动任何不必要的圣战。 当归结为编码样式时&#xff0c;大多数选择都是相当随意的&#xff0c;并取决于个人喜好。 是的&#xff0c;即使在编辑器之间制表符宽度改变了&…

ES group分组聚合的坑

参考链接&#xff1a;https://blog.csdn.net/u010454030/article/details/71762838 ES group分组聚合的坑 原来知道Elasticsearch在分组聚合时有一些坑但没有细究&#xff0c;今天又看了遍顺便做个笔记和大家分享一下。 我们都知道Elasticsearch是一个分布式的搜索引擎&#xf…

字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;…

Codeforces Round #498 (Div. 3) F. Xor-Paths

题目链接&#xff1a;F. Xor-Paths 题解&#xff1a;从起点和终点双向搜索在中间相遇时更新答案 1 #include<bits/stdc.h>2 #include<set>3 #include<cstdio>4 #include<iomanip>5 #include<iostream>6 #include<string>7 #include<cst…

创建健壮的微服务架构所涉及的组件

在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下问题 我们将如何注册微…

MATLAB画图命令zz

一、散点图 1&#xff0e;1&#xff0e;命令 plot 功能 线性二维图。在线条多于一条时&#xff0c;若用户没有指定使用颜色&#xff0c;则plot循环使用由当前坐标轴颜色顺序属性&#xff08;current axes ColorOrder property&#xff09;定义的颜色&#xff0c;以区别不同的…

jax-rs jax-ws_JAX-WS入门

jax-rs jax-wsJAX-WS代表XML Web Services的Java API。 它是一种Java编程语言API&#xff0c;用于创建Web服务和使用XML进行通信的客户端。 这篇文章是JAX-WS的快速入门。 先决条件 GlassFish与Eclipse集成在一起 。 创建JAX-WS Web服务 1.在Eclipse中创建一个名为“ com.e…

lingo解题报告内容解释

1.2菜单介绍 1.2.1 File 1 New 新建一个窗口,当你执行这个命令时,会出现如下对话框: 你可以在对话框中选择你想要建立的类型.类型如下: 1)扩展名为(*.lg4) LG4格式是LINGO4.0的版本,是在Windows下最主要的储存文件格式,这种格式支持字体格式,自定义格式以及动态连接, LG4以二进…

OpenShift上的无痛集装箱化JBoss通用贷款处理

我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat之外的任何应用程序开发工具。我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 容器开发套件&#xff08;CDK&#xff09; 。 到目前为止&#xff0c;您所拥有的只是一个…

多任务编程—多进程

什么是多任务编程&#xff1f; 多任务编程其实和计算机系统内核有关&#xff0c;通过程利用多个计算机内核同时执行程序&#xff0c;以此来提升程序执行的效率。 多任务编程其中包括&#xff0c;多进程、多线程和多协程&#xff0c;这三种多任务编程各有各的优点和缺点&#xf…

java锁实现_Java锁实现

java锁实现我们都将第三方库用作开发的正常部分。 通常&#xff0c;我们无法控制其内部。 JDK随附的库是一个典型示例。 这些库中的许多库都使用锁来管理争用。 JDK锁具有两种实现。 一个使用原子CAS样式指令来管理索赔过程。 CAS指令往往是最昂贵的CPU指令类型&#xff0c;并且…

洛谷 P1027 Car的旅行路线

P1027 Car的旅行路线 题目描述 又到暑假了&#xff0c;住在城市 AA 的 CarCar 想和朋友一起去城市 BB 旅游。她知道每个城市都有 44 个飞机场&#xff0c;分别位于一个矩形的 44 个顶点上&#xff0c;同一个城市中 22 个机场之间有 11 条笔直的高速铁路&#xff0c;第 II 个城市…