fzu 2250 不可能弹幕结界 分析+模拟,考察思维严谨。

Accept: 5 Submit: 13
Time Limit: 1000 mSec Memory Limit : 65536 KB
Problem Description
咲夜需要穿过一片弹幕区,由于咲夜发动了符卡“The World”,所以弹幕是静止的。这片弹幕区以一个n*m的矩阵的形式给出。
‘.’表示这个位置是安全的,’x’表示这个位置上是有子弹的,禁止通行。咲夜每次能向左、右、下三个方向的相邻格子走,但是不能向上走。 同时由于时间有限,咲夜在进入每一行之后最多只能横向走k步。你可以简单地认为我们的目标就是从第0行走到第n+1行,起点和终点可以是在第0行和第n+1行的任意位置,当然第0行和第n+1行都是没有弹幕的。
然而这是号称不可能的弹幕结界,所以咲夜很可能无法穿过这片弹幕,所以咲夜准备了一个只能使用一次的技能,纵向穿越,她可以从任意位置直接穿越到另外任意一行的同一个位置(所在列不变),当然她只能向下穿越,不能向上穿越。穿越的距离越远,耗费的资源自然越多,所以她想知道最短的穿越距离,才能使她成功通过这片弹幕区。
Input
输入包含多组数据。
对于每组数据:
第一行输入三个整数n,m,k,如上所述。
接下下输入一个n×m的矩阵,’.’表示当前这格没有子弹,是安全的,’x’表示这各有子弹,禁止通行。
N<=1000,k<=m<=1000
Output
对于每组数据输出一个整数,表示最短的穿越距离。
Sample Input
Sample Output
Hint
对于第一组样例,最优解是从第一行第二列走到第三行第一列,然后跳到第6行第一列,穿越距离为(6 – 3) = 3。
long long类型请用%I64d输出
Source
FOJ有奖月赛-2017年4月(校赛热身赛)
- /**
- 题目:Problem 2250 不可能弹幕结界
- 链接:http://acm.fzu.edu.cn/problem.php?pid=2250
- 题意:看原题。
- 思路:
- dtu[i][j]表示从底向上,不穿越能够到达的位置。
- utd[i][j]表示从上到下,不穿越能够到达的位置。
- 然后枚举每一列,对每一列进行差值处理;取最小值。
- */
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <set>
- #include <vector>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int inf = 0x3f3f3f3f;
- const int maxn = 1e5+;
- const double eps = 1e-;
- char a[][];
- int dtu[][];
- int utd[][];
- int lt[][], rt[][];
- ///预处理每个位置最左最右可达的地方。
- int n, m, k;
- void init()
- {
- memset(lt, -, sizeof lt);
- memset(rt, -, sizeof rt);
- for(int i = ; i <= n; i++){
- for(int j = ; j <= m; j++){
- if(a[i][j]=='.'){
- lt[i][j] = lt[i][j-]+;
- }
- }
- for(int j = m; j >= ; j--){
- if(a[i][j]=='.'){
- rt[i][j] = rt[i][j+]+;
- }
- }
- }
- }
- int Min(int a,int b)
- {
- return a>b?b:a;
- }
- int Max(int a,int b)
- {
- return a>b?a:b;
- }
- void dfsdtu(int x,int y)
- {
- if(x==){
- dtu[x][y] = ;
- return ;
- }
- dtu[x][y] = ;
- if(a[x-][y]=='x') return ;
- for(int i = Max(y-lt[x-][y],y-k); i <= Min(y+rt[x-][y],y+k); i++){
- if(dtu[x-][i]) break;
- dfsdtu(x-,i);
- }
- for(int i = Min(y+rt[x-][y],y+k); i >= Max(y-lt[x-][y],y-k); i--){
- if(dtu[x-][i]) break;
- dfsdtu(x-,i);
- }
- }
- void dfsutd(int x,int y)
- {
- if(x==n){
- utd[x][y] = ;
- return ;
- }
- utd[x][y] = ;
- if(a[x+][y]=='x') return ;
- for(int i = Max(y-k,y-lt[x+][y]); i <= Min(y+rt[x+][y],y+k); i++){
- if(utd[x+][i]) break;
- dfsutd(x+,i);
- }
- for(int i = Min(y+rt[x+][y],y+k); i >= Max(y-lt[x+][y],y-k); i--){
- if(utd[x+][i]) break;
- dfsutd(x+,i);
- }
- }
- int main()
- {
- while(scanf("%d%d%d",&n,&m,&k)!=EOF)
- {
- for(int i = ; i<= n; i++){
- scanf("%s",a[i]+);
- }
- init();
- memset(dtu, , sizeof dtu);
- memset(utd, , sizeof utd);
- for(int i = ; i <= m; i++){
- if(a[n][i]=='.'){
- dfsdtu(n,i);//由底向上
- }
- }
- for(int i = ; i <= m; i++){
- if(a[][i]=='.'){
- dfsutd(,i);//由上到下
- }
- }
- int ans = n+;
- for(int i = ; i <= m; i++){
- int dt = n+, ut = ;
- for(int j = ; j <= n; j++){
- if(dtu[j][i]){
- dt = j;
- }
- if(utd[j][i]){
- ut = j;
- }
- if(dt>ut){
- ans = Min(ans,dt-ut);
- }
- ans = Min(ans,dt);
- ans = Min(ans,n+-ut);
- if(dt==||ut==n) ans = ;
- }
- }
- printf("%d\n",ans);
- }
- return ;
- }
fzu 2250 不可能弹幕结界 分析+模拟,考察思维严谨。的更多相关文章
- FOJ2250 不可能弹幕结界
Problem 2250 不可能弹幕结界 Time Limit: 1000 mSec Memory Limit : 65536 KB Problem Description 咲夜需要穿过一片弹幕 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
- 从session实现机制分析模拟请求验证码的可行性(转)
悲剧了,发现写完这篇blog没有配上这个格调超高的标题. 1.0问题背景 现在要实现一个带验证码网站的的自动登陆功能.验证码识别过程不再这篇文章的讨论之中.(之后有篇文章我会详细的总结验证码的识别 ...
- B站弹幕姬(🐔)分析与开发(下篇)
接上篇 下面开始分析弹幕信息: 当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了.老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16 ...
- B站弹幕姬(🐔)分析与开发(上篇)
辞职之后 休息了一段时间,最近准备开始恢复去工作的状态了,所以搞点事情来练练手.由于沉迷b站女妆大佬想做个收集弹幕的然后根据弹幕自动回复一些弹幕的东西.网上搜了一下有个c#的版本,感觉还做得不错,于是 ...
- FZU 1884——排火车——————【栈的模拟】
排火车 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- Death to Binary? 分析模拟
/** 题目:Death to Binary? 链接:https://vjudge.net/contest/154246#problem/T 题意:略. 思路: 注意事项: 给的字符串存在前导0: 存 ...
- HDU 6215 Brute Force Sorting(模拟链表 思维)
Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
随机推荐
- 启用多处理器编译--加快VS2013编译
依次打开项目“属性“==>”配置属性“==>”C/C++(或其它语言)“==>”常规“,最后一项,多处理器编译选择是. 官方解释如下: /MP 选项在命令行上以减少总时间编译源文件. ...
- Java汉字md5值不一致问题
原文:http://blog.csdn.net/earthhour/article/details/51188437 通过main方法测试得到一个加密值,通过servlet request调用得到一个 ...
- 【Node.js】1.安装步骤
1.在官网找到对应版本下载 2.点击安装 3.检查安装成功 path可以看到node.js的安装目录已经自动配置在环境变量path中了 如果node -v或者node --version不能正确展示当 ...
- 配置kubernetes UI图形化界面
配置Kubernetes网络 在master和nodes上都需要安装flannel yum install flannel 在master和nodes上都需要配置flannel vi /etc/sys ...
- mybatis 一对多
person package com.kerwin.mybatis.pojo; import java.util.List; public class Person { private int id; ...
- DevExpress 15.1.sln
Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio VisualStudioVersion = 14 ...
- 踩坑记:httpComponents 的 EntityUtils
今天写的一个服务程序,有人报告获得的数据中文乱码,而我是用 apache 通过 httpComponents 去取得数据的.于是开启日志的 debug 级别. 在日志里果然发现中文不见了,有乱码出现: ...
- iOS 系统框架
iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch l ...
- B2:观察者模式 Observer
定义了一种一对多的依赖关系,多个观察者对象同时监听某一主题的变化,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们可以更新自己. 应用场景:某个实例的变化影响到了其他对象. UML: 示例代 ...
- Oracle数据类型,函数与存储过程
字符串类型 固定长度:char nchar n 表示Unicode编码 可变长度: varchar2 nvarchar2 数字类型:number(P,S)P:整数位数,S小数位数 ...