题意翻译

有一个n*m的格子图,其中有一些是黑色的,另一些为白色。

从某个白色格子的中心点向左上(NW),左下(SW),右上(NE),右下(SE)四个方向中的一个发出一束光线,若光线碰到黑色格子或者墙壁(即边界)会反射。反射情况如图所示:

我们不难发现,光线能穿过的格子总数是可以算出的。假如光线经过了某个格子的中心,则称光线经过了这个格子。求光线经过的格子总数。

由于答案可能很大,请使用long long的C++选手注意:请勿使用%lld,推荐cout或者%I64d

题目描述

Imagine an n×mn×m grid with some blocked cells. The top left cell in the grid has coordinates (1,1)(1,1) and the bottom right cell has coordinates (n,m)(n,m) . There are kk blocked cells in the grid and others are empty. You flash a laser beam from the center of an empty cell (x_{s},y_{s})(xs​,ys​) in one of the diagonal directions (i.e. north-east, north-west, south-east or south-west). If the beam hits a blocked cell or the border of the grid it will reflect. The behavior of the beam reflection in different situations is depicted in the figure below.

After a while the beam enters an infinite cycle. Count the number of empty cells that the beam goes through at least once. We consider that the beam goes through cell if it goes through its center.

输入输出格式

输入格式:

The first line of the input contains three integers nn , mm and kk (1<=n,m<=105,0<=k<=105) . Each of the next kk lines contains two integers(1<=xi​<=n,1<=yi​<=m) indicating the position of the ii -th blocked cell.

The last line contains(1<=xs​<=n,1<=ys​<=m) and the flash direction which is equal to "NE", "NW", "SE" or "SW". These strings denote directions (-1,1)(−1,1) , (-1,-1)(−1,−1) , (1,1)(1,1) , (1,-1)(1,−1) .

It's guaranteed that no two blocked cells have the same coordinates.

输出格式:

In the only line of the output print the number of empty cells that the beam goes through at least once.

Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

输入输出样例

输入样例#1:
3 3 0
1 2 SW
输出样例#1:

6

输入样例#2:

7 5 3

3 3 4

3 5 3

2 1 SE

输出样例#2:

14

题目分析

恶心啊。

根据惯例我们先列一下需要考虑的问题:
1.四种方块的反射状态

2.在一定时间后光线会重复循环,此时终止

3.数据范围带来的不能用邻接矩阵存图的麻烦

4.坐标从0开始很不好处理

写吧,细节解决方案看代码

Code

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std; const int MAXN = 1e5 + ;
const int INF = 0x3f3f3f3f; int n,m,k;
int sx,sy,sd;
vector<int> block[MAXN];
string S;
bool flag; void add(int x,int y) {
block[x].push_back(y);
return;
} void scan() {
scanf("%d%d",&n,&m,&k);
scanf("%d%d%s",&sx,&sy,&S);
if(S == "NW") sd = ;
else if(S == "NE") sd = ;
else if(S == "SW") sd = ;
else if(S == "SE") sd = ;
int x,y;
for(int i = ;i <= k;i++) {
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i = ;i <= n;i++) add(i,),add(i,m + );
for(int j = ;j <= n;j++) add(,j),add(n + ,j);
add(,);add(n + ,m + );
return;
} void dir_judge(int x,int y,int &d) {
if(d == ) {
if(!getblock(x-,y-)) return;
else {
int opt = getblock(x,y-) - getblock(x-,y);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x-,y+)) return;
else {
int opt = getblock(x-,y) - getblock(x,y+);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x+,y-)) return;
else {
int opt = getblock(x,y-) - getblock(x+,y);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
} else if(d == ) {
if(!getblock(x+,y+)) return;
else {
int opt = getblock(x-,y) - getblock(x,y-);
if(opt == ) d = ;
else if(opt == ) d = ;
else if(opt == -) d = ;
}
}
}
/*
NW 1 NE 2 SW 3 SE 4
*/ void start() {
int x = sx,y = sy,d = sd;
while(!flag) {
dir_judge(x,y,d);
}
} main() {
scan();
start();
}

[CodeForces] 274E Mirror Room的更多相关文章

  1. [Codeforces 274E]:Mirror Room(模拟)

    题目传送门 题目描述 有一个$n\times m$的格子图,其中有一些是黑色的,另一些为白色.从某个白色格子的中心点向左上($NW$),左下($SW$),右上($NE$),右下($SE$)四个方向中的 ...

  2. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror) in codeforces(codeforces730)

    A.Toda 2 思路:可以有二分来得到最后的数值,然后每次排序去掉最大的两个,或者3个(奇数时). /************************************************ ...

  3. [codeforces 241]C. Mirror Box

    [codeforces 241]C. Mirror Box 试题描述 Mirror Box is a name of a popular game in the Iranian National Am ...

  4. Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!

    VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...

  5. Codeforces Bubble Cup 8 - Finals [Online Mirror] B. Bribes lca

    题目链接: http://codeforces.com/contest/575/problem/B 题解: 把链u,v拆成u,lca(u,v)和v,lca(u,v)(v,lca(u,v)是倒过来的). ...

  6. Codeforces Bubble Cup 8 - Finals [Online Mirror]H. Bots 数学

    H. Bots Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/H Desc ...

  7. Codeforces Bubble Cup 8 - Finals [Online Mirror] D. Tablecity 数学题

    D. Tablecity Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/D ...

  8. Codeforces Bubble Cup 8 - Finals [Online Mirror] F. Bulbo DP

    F. Bulbo Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/F Des ...

  9. Codeforces 1182D Complete Mirror [树哈希]

    Codeforces 中考考完之后第一个AC,纪念一下qwq 思路 简单理解一下题之后就可以发现其实就是要求一个点,使得把它提为根之后整棵树显得非常对称. 很容易想到树哈希来判结构是否相同,而且由于只 ...

随机推荐

  1. Java原型模式之浅拷贝-深拷贝

    一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: ...

  2. node.js中的require

    初初接触node.js,印象最深刻的就是开头密密麻麻的require了. 这是什么东西? 其实也没啥大惊小怪的.require就是为了引用别的js文件,利于模块化编程,重用.以及避免过多代码挤在同一个 ...

  3. windows 下 opencv 3.x 的安装及常见问题的解决

    1. 下载与配置 下载地址:Releases - OpenCV library(选择合适的平台和版本) 配置步骤见:VS 2013 统一修改所有工程的目录配置(以 boost.opencv3 的安装为 ...

  4. (函数即服务)Faas的现状与未来

    刚看到jolestar一位从法律转行程序员的前辈写了一篇Faas现状与未来的文章,里面很多观点都很有启发,或许正如他说的那样,由于Faas能较好的解决资源利用率和开发效率问题,2018年Faas将变得 ...

  5. jsp jquery js 的基本路径获取

    引子:js中需要当前页面的基础路径,获取不到request,可以通过如下方法来解决!   1.jsp基础路径,在jsp头部加上,获取基础路径http://localhost:8080/project/ ...

  6. Linux文件属性相关补充及软硬连接

    第1章 文件属性相关 1.1 文件的属性 1.1.1 扩展名 windows  通过扩展名区分不同的类型的文件 linux 扩展名是给人类看的 方便我们区分不同类型文件 .conf      配置文件 ...

  7. shopnc学习

    ---恢复内容开始--- 以前没有怎么接触过shopnc,感觉界面挺漂亮的,不过后来自己需要开发一个电商系统,就顺便参考了下,感觉构架垃圾的一塌糊涂.不过平时做这个系统二次开发的业务比较多,所以简单的 ...

  8. python 学习笔记一 (数据结构和算法)

    2018年刚刚过完年,从今天起,做一个认真的技术人.开始进入记笔记阶段. python内置了很多数据结构,list , set,dictionary 1.将序列分解为单独的变量 1.1 通过赋值的方式 ...

  9. linux命令(006) -- w

    w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令.执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序.单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户 ...

  10. 入门开发工具idea常见问题之选项中没有servlet

    1.在maven中如果创建不了servlet,在project Setting旁边的添加一个web选项,就可以创建servlet了. 初次接触这个陌生的工具还是不太好弄.