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,一经查实,立即删除!

相关文章

Matlab reshape重新排布数组

使用reshape需要保证前后调整后的元素个数一致,否则会报错

hibernate关联映射_具有关联映射的Hibernate Composite ID

hibernate关联映射最近&#xff0c;我们面临着带有复合id字段的Hibernate关联映射的棘手情况。 我们需要与一对一和多对一进行双向关联。我们的拖曳表是“ REPORT”和“ REPORT_SUMMARY”&#xff0c;它们之间具有从REPORT到REPORT_SUMMARY的一对多关系&#xff0c;而从REPORT_…

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

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

博弈-sg函数的原理和优化(hdu-1536)

sg函数&#xff1a;sg函数是博弈中的确定一个position性质的一个函数&#xff0c;全称是sprague-grundy。性质1&#xff1a;对于所有的p-position&#xff0c;都有sg 0&#xff1b;对于所有的n-position都有sg &#xff01; 0&#xff1b; 性质2&#xff1a;某点a的sg函数的值…

java项目中Classpath路径到底指的是哪里?

1、src不是classpath, WEB-INF/classes,lib才是classpath&#xff0c;WEB-INF/ 是资源目录, 客户端不能直接访问。 2、WEB-INF/classes目录存放src目录java文件编译之后的class文件&#xff0c;xml、properties等资源配置文件&#xff0c;这是一个定位资源的入口。 3、引用clas…

程序员的八个级别

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;我们最近发布了对…

Matlab各种分布的函数

正态分布&#xff1a;norm二项分布&#xff1a;bino卡方分布&#xff1a;chi2指数分布&#xff1a;exp柏松分布&#xff1a;poiss随机数&#xff1a;rnd密度函数&#xff1a;pdf累积概率&#xff1a;cdf逆累积分布&#xff1a;icdf&#xff0c;inv参数估计&#xff1a;fit对应组…

Python的配置文件模块yaml的使用

转自&#xff1a;君惜丶 简述 和GNU一样&#xff0c;YAML是一个递归着说“不”的名字。不同的是&#xff0c;GNU对UNIX说不&#xff0c;YAML说不的对象是XML。 YAML不是XML。 为什么不是XML呢&#xff1f;因为&#xff1a; YAML的可读性好。YAML和脚本语言的交互性好。YAML使用…

Matlab各种排序函数

sortsortrows 把整行的数据看作一个整体&#xff0c;对数据进行排序issorted, 判断是否已经排序了

位运算实例(一):判断奇偶性

同样一个问题&#xff0c;位运算可以提高程序的运行效率。 下面讲一下关于奇偶性的判断。 常规方法 public static boolean isOdd(int i){ return i % 2 ! 0; } 位运算方法 public static boolean isOdd(int i){ return (i & 1) ! 0; } 说明&#xff1a; 我们知道计算机中的…

Spring Security原理与应用

Spring Security是什么 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff08;注&#xff1a;包括认证与权限获取、配置、处理相关实例&#xff09;&#xff0c;充分利…

javafx2_JavaFX 2 GameTutorial第5部分

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

Matlab各种最值问题

最大最小maxmin求多个最小值,并返回其位置[B,ind] sort(A);B(1:n);前n个最小值ind(1:n);前n个最小值的位置

最长递增子序列问题的求解

最长递增子序列问题是一个很基本、较常见的小问题&#xff0c;但这个问题的求解方法却并不那么显而易见&#xff0c;需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想&#xff0c;能够锻炼设计较复杂算法的思维…

史上最简单的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…

Matlab积分

yint(fx,x,a,b);%函数表达式&#xff0c;自变量&#xff0c;下限&#xff0c;上限注&#xff1a;求得到y为sym类型&#xff0c;不是数值&#xff0c;可以使用subs转换如&#xff1a;subs(y,1); subs(y,a,1);%第一个给y赋1&#xff0c;第二个给y中的a赋1

最长有序子序列—动态规划算法

动态规划使用范围&#xff1a;&#xff08;http://baike.baidu.com/view/28146.htm&#xff09; 任何思想方法都有一定的局限性&#xff0c;超出了特定条件&#xff0c;它就失去了作用。同样&#xff0c;动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效…