Codeforces.97D.Robot in Basement(bitset 模拟)
(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 模拟)的更多相关文章
- CodeForces 97D. Robot in Basement
time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...
- cf97D. Robot in Basement(模拟 bitset)
题意 题目链接 Sol 接下来我的实现方式和论文里不太一样 然后用bitset优化,上下走分别对应着右移/左移m位,左右走对应着右移/左移1位 我们可以直接预处理出能走的格子和不能走的格子,每次走的时 ...
- Codeforces 626A Robot Sequence(模拟)
A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- 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 ...
- codeforces 723B Text Document Analysis(字符串模拟,)
题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...
- Codeforces Round #304 C(Div. 2)(模拟)
题目链接: http://codeforces.com/problemset/problem/546/C 题意: 总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张 ...
- Codeforces 749C:Voting(暴力模拟)
http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...
- Educational Codeforces Round 2 A. Extract Numbers 模拟题
A. Extract Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
随机推荐
- python selenium打开新窗口,多窗口切换
# coding=utf-8 from selenium import webdriver browser=webdriver.Firefox() browser.maximize_window() ...
- C++ Primer 笔记——多重继承与虚继承
1.在多重继承中,基类的构造顺序与派生类列表中基类的出现顺序保持一致,与初始值列表中的顺序无关. 2.在C++11新标准中,允许派生类从它的一个或几个基类中继承构造函数.但是如果从多个基类中继承了相同 ...
- Python自定义-分页器
Python自定义-分页器 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3 ...
- 捷信达会员管理系统SQL语句相关
捷信达会员管理系统SQL语句相关 USE gshis GO SET ANSI_NULLS, QUOTED_IDENTIFIER ON GO /***************************** ...
- 实现虚拟机VMware上Centos操作系统与主机windows之间互相复制与粘贴
1.启动你的虚拟机,然后点击虚拟机,如下所示(未安装的话,显示的是安装VMware Tools): 2.点击安装Vmware tools以后显示如下所示: 3.VMwareTools-9.9.2-24 ...
- proc/net/dev实时网速统计实例
https://blog.csdn.net/dosthing/article/details/80384541 http://www.l99.com/EditText_view.action?text ...
- [转]安卓手机google商店的账号切换退出方式
来源:http://blog.csdn.net/bianchengninhao/article/details/42240839 1.设置 2.账户 3.Google 4. 5.点击菜单键 6.最后删 ...
- Discuz3.2 新用户插入数据库SQL
我们的网站要和Discuz整合到一起,有个新用户同步的需求,网络上很多的做法是用 UCenter的接口来做,反正最后都是插入SQL,笔者使用了直接操作数据库的方式,把操作的表和SQL整理了下,后面如果 ...
- WebApi接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了 ...
- 一起学Hive——使用MSCK命令修复Hive分区
最近在使用Hive的过程中,在备份数据时,经常会使用cp或mv命令来拷贝数据,将数据拷贝到我们新建备份表的目录下面,如果不是分区表,则上面的操作之后,新建的备份表可以正常使用,但是如果是分区表的,一般 ...