Problem 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

6 5 2 x.x.. ..xx. .xxx. xx.xx xx..x ..x.x 4 4 1 .xxx .xxx ...x xx.x

Sample Output

3 2

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 不可能弹幕结界 分析+模拟,考察思维严谨。的更多相关文章

  1. FOJ2250 不可能弹幕结界

    Problem 2250 不可能弹幕结界 Time Limit: 1000 mSec    Memory Limit : 65536 KB Problem Description 咲夜需要穿过一片弹幕 ...

  2. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    [前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...

  3. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  4. 从session实现机制分析模拟请求验证码的可行性(转)

    悲剧了,发现写完这篇blog没有配上这个格调超高的标题.   1.0问题背景 现在要实现一个带验证码网站的的自动登陆功能.验证码识别过程不再这篇文章的讨论之中.(之后有篇文章我会详细的总结验证码的识别 ...

  5. B站弹幕姬(🐔)分析与开发(下篇)

    接上篇 下面开始分析弹幕信息: 当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了.老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16 ...

  6. B站弹幕姬(🐔)分析与开发(上篇)

    辞职之后 休息了一段时间,最近准备开始恢复去工作的状态了,所以搞点事情来练练手.由于沉迷b站女妆大佬想做个收集弹幕的然后根据弹幕自动回复一些弹幕的东西.网上搜了一下有个c#的版本,感觉还做得不错,于是 ...

  7. FZU 1884——排火车——————【栈的模拟】

    排火车 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status P ...

  8. Death to Binary? 分析模拟

    /** 题目:Death to Binary? 链接:https://vjudge.net/contest/154246#problem/T 题意:略. 思路: 注意事项: 给的字符串存在前导0: 存 ...

  9. HDU 6215 Brute Force Sorting(模拟链表 思维)

    Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

随机推荐

  1. 下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法

    转:http://alyzq.com/?p=627 如果不会使用,请看下面的操作步骤 引言(可以不看): 下面介绍一下,下载谷歌浏览器(Google Chrome)扩展的离线安装包crx文件最简单的方 ...

  2. iOS开发笔记_4自定义TabBar

    新博客:http://www.liuchendi.com 好多APP都使用的是自定义的TabBar,那这个功能应该如何实现呢?首先应该解决的问题就是,加载NavigationController的时候 ...

  3. [Git] Git把Tag推送到远程仓库

    转载: http://blog.csdn.net/hustpzb/article/details/8056518 用git tag来给工程打上标签,但是这个命令只是在本地仓库打标签而已, 为了能把标签 ...

  4. 关于yum的一些安装问题

    最近折腾CentOS和kubernetes,遇到一些安装问题,把和yum相关的逐步总结如下: 如何用本地的cdrom作为yum源 mount /dev/cdrom /mnt 先查询是否安装了creat ...

  5. Java笔记7:最简单的网络请求Demo

    一.服务器端 1 新建一个工程,建立一个名为MyRequest的工程. 2 FileàProject StructureàModulesà点击最右侧的“+”àLibraryàJava 找到Tomcat ...

  6. pig笔记

    1.安装Pig 将pig添加到环境变量当中 2.pig使用 首先将数据库中的数据导入到HDFS上 sqoop import --connect jdbc:mysql://192.168.1.10:33 ...

  7. 用C++实现Huffman文件编码和解码(2 总结)

    这个是代码是昨天写完的,一开始的时候还出了点小bug,这个bug在晚上去吃饭的路上想明白的,回来更改之后运行立刻完成最后一步,大获成功. 简单说下huffman编码和文件压缩主要的技术. Huffma ...

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-PLC支持哪些PLC语言类型

    PLC的标准化语言,统称为IEC 61131-3,该规范下有五种不同的语言可以创建PLC程序,TwinCAT都支持. IL(指令列表): 每条指令都从一个新行开始并包含一个操作和一个或多个操作数,一条 ...

  9. 使用Google-Authenticator加强serverSSH登录

    对于须要特殊加密的人群,我这里给出对应的方法来进行谷歌式加密. 过程例如以下: 准备: 首先在你的手机上准备好client(自己百度下载) 接下来依照命令做: date 查看系统时间       da ...

  10. C#异常处理机制初步

    原地址:http://www.sudu.cn/info/html/edu/net/20071227/50446.html 一.c#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能 ...