题目链接


(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. bzoj 3529

    非常好的一道莫比乌斯反演题,对提升自己的能力有很大帮助. 首先我们分析一下题意:题意让我们求,其中 那么我们首先对后面的式子进行一下变形,变形过程详见https://blog.csdn.net/lle ...

  2. vue 在.vue文件里监听路由

    监听路由  watch   $route vue项目中的App.vue 文件 <template> <div id="app"> <!--includ ...

  3. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...

  4. jQuery之导航菜单(点击该父节点时子节点显示,同时子节点的同级隐藏,但是同级的父节点始终显示)

    注:对于同一个对象不超过3个操作的,可直接写成一行,超 过3个操作的建议每行写一个操作.这样可读性较强,可提高代码的可读性和可维护性 核心代码: $(".has_children" ...

  5. python一个用例,多组参数,多个结果

    在某种情况下,需要用不同的参数组合测试同样的行为,你希望从test case的执行结果上知道在测试什么,而不是单单得到一个大的 test case:此时如果仅仅写一个test case并用内嵌循环来进 ...

  6. 饮冰三年-人工智能-linux-08 软件包管理(Python的安装)

    1:软件包存放的位置 media/CentOS_6.9_Final/Packages文件夹下 2.RPM就是Red Hat Package Manger(红帽软件包管理工具)的缩写. 2.1 常用的命 ...

  7. Selenium+PhantomJS使用时报错原因及解决方案

    问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been dep ...

  8. 【C++ Primer | 10】再探迭代器

    插入迭代器 1. 测试代码: #include<iostream> #include<vector> #include<list> #include<iter ...

  9. elasticsearch-HQ 安装与使用

    https://github.com/ElasticHQ/elasticsearch-HQ Download or clone the repository. Open terminal and po ...

  10. python从零安装

    一 python 1.安装python https://www.python.org/ 环境变量path添加 ;C:\Python27;C:\Python27\Lib\site-packages;C: ...