题目链接


(ozr attack)

考虑怎么暴力,就是先在所有非障碍格子上全放上机器人,然后枚举每一步,枚举每个机器人移动这一步,直到所有机器人都在出口位置。复杂度是\(O(nmk)\)的。

怎么优化呢,注意到每次移动都是所有机器人一起向同一个方向移动,而我们只关心每个位置上是否有机器人。

可以用bitset优化每次移动。把格子编好号后,向上移动就是整体右移\(m\)位,向左走就是整体右移一位...

还有个问题是,机器人不能往障碍上走。我们可以先把能走的机器人走过去,然后把会撞墙的机器人补回来。

复杂度\(O(\frac{nmk}{w})\)。


//934ms	0KB
#include <cstdio>
#include <bitset>
#include <cstring>
const int N=153; std::bitset<N*N> can,ban,now; int main()
{
static char s[100005];
int n,m,K,pos=0; scanf("%d%d%d",&n,&m,&K);
for(int i=1,now=0; i<=n; ++i)
{
scanf("%s",s+1);
for(int j=1; j<=m; ++j,++now)
{
s[j]=='#'?ban[now]=1:can[now]=1;
if(s[j]=='E') pos=now;
}
}
if(can.count()==1&&can[pos]==1) return putchar('0'),0;
now=can; scanf("%s",s+1);
for(int i=1,l=K; i<=l; ++i)
{
switch(s[i])
{
case 'U': now=(now>>m&can)|(now&(ban<<m)); break;
case 'D': now=(now<<m&can)|(now&(ban>>m)); break;
case 'L': now=(now>>1&can)|(now&(ban<<1)); break;
case 'R': now=(now<<1&can)|(now&(ban>>1)); break;
}
if(now.count()==1&&now[pos]==1) return printf("%d\n",i),0;
}
puts("-1"); return 0;
}

Codeforces.97D.Robot in Basement(bitset 模拟)的更多相关文章

  1. CodeForces 97D. Robot in Basement

    time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. cf97D. Robot in Basement(模拟 bitset)

    题意 题目链接 Sol 接下来我的实现方式和论文里不太一样 然后用bitset优化,上下走分别对应着右移/左移m位,左右走对应着右移/左移1位 我们可以直接预处理出能走的格子和不能走的格子,每次走的时 ...

  3. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  4. Codeforces 716B Complete the Word【模拟】 (Codeforces Round #372 (Div. 2))

    B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. codeforces 723B Text Document Analysis(字符串模拟,)

    题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...

  6. Codeforces Round #304 C(Div. 2)(模拟)

    题目链接: http://codeforces.com/problemset/problem/546/C 题意: 总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张 ...

  7. Codeforces 749C:Voting(暴力模拟)

    http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...

  8. Educational Codeforces Round 2 A. Extract Numbers 模拟题

    A. Extract Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...

  9. CodeForces 797C Minimal string:贪心+模拟

    题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...

随机推荐

  1. hdu1540 区间合并+询问某点的最大连续块

    询问操作需要搞一下 今天被区间合并降智了 /* D a: 摧毁第a个点 Q a:询问a所在的点的块大小 R :修复最后被破坏的点 对于所有的点需要进行一次更新 更新比较容易,tag用来表示区间是否是完 ...

  2. Git使用二:git与svn的区别与工作流程

    svn记录的是每一次版本变动的内容,三角形代表改动的内容 git是将每个版本独立保存 git的三棵树:工作区域.暂存区域.git仓库 工作目录:平时存放项目的地方暂存区域:临时存放改动,即将提交到仓库 ...

  3. Java+selenium之WebDriver对浏览器的简单操作(一)

    操作浏览器的主要方法都来自 org.openqa.selenium.WebDriver 这个接口 这些方法都是在 org.openqa.selenium.remote.RemoteWebDriver这 ...

  4. openmp查看最大线程数量

    CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(omp_test) find_package(OpenMP REQUIRED) i ...

  5. Exception in thread "main" java.lang.NullPointerException

    1.在window操作系统上,使用eclipse开发工具从hdfs分布式文件系统上下载文件报空指针异常解决方法: log4j:WARN No appenders could be found for ...

  6. snmp v3的安全配置 snmp认证与加密配置(53)

    http://www.ttlsa.com/zabbix/snmp-v3-configuration/

  7. Chino的数列

    题解: 一道练代码能力的题目.. 首先很显然他是一道平衡树裸题 第5个操作是势能分析维护最大值最小值就可以了 另外设置虚点和noip2017队列那题一样(不过我只写过线段树) 具体细节: 1.内存池, ...

  8. C# 之 Structure 和 Class的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  9. 【Codeforces】Gym100633 D. LWDB

    题解 点分治,然后每个点上挂着一个距离不超过\(a_{i}\)的颜色改成\(c\) 用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色 ...

  10. Flink的广播变量

    Flink支持广播变量,就是将数据广播到具体的taskmanager上,数据存储在内存中,这样可以减缓大量的shuffle操作: 比如在数据join阶段,不可避免的就是大量的shuffle操作,我们可 ...