题意翻译

有一个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. vim随想笔记(1)

    本人是一个vim的狂热粉丝,越是使用vim,越是认为琐碎内容太多,时不时地出现一些自己没有见过的使用方法.命令. 因此准备在博客上用空余时间在阅读<学习vi和vim编辑器>的基础上总结一下 ...

  2. linux RHEL 修改hostname 不需要重启机器

    1. 修改/etc/sysconfig/network 中的hostname HOSTNAME=newhostname 运行命令起作用: /etc/rc.d/rc.sysinit 2. 修改/ect/ ...

  3. The bytes/str dichotomy in Python 3

    The bytes/str dichotomy in Python 3 - Eli Bendersky's website https://eli.thegreenplace.net/2012/01/ ...

  4. ClipboardEvent.clipboardData

    ClipboardEvent.clipboardData https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboa ...

  5. leetcode笔记:Jump Game

    一. 题目描写叙述 Given an array of non-negative integers, you are initially positioned at the first index o ...

  6. C - Gr-idian MST

    Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement On an xy plane, in an ...

  7. 【POJ 2018】 Best Cow Fences

    [题目链接] http://poj.org/problem?id=2018 [算法] 二分平均值 检验时将每个数减去二分的值,求长度至少为L的子序列和的最大值,判断是否大于0 [代码] #includ ...

  8. 2018.2.24Test总结

    T1(luogu3434) comment:水题,考试时我想的是开一个数组在读入时预处理出该长度什么时候会被拦住,但这样数组开不下,剩下只能模拟. 实际上应该把圆筒变成递减序列,再二分该长度即可. T ...

  9. hibernate中id中的 precision 和 scale 作用

    转自:https://www.cnblogs.com/IT-Monkey/p/4077570.html <hibernate-mapping>     <class name=&qu ...

  10. Mechanize抓取数据【Ruby】

    创建: 2017/08/05 更新: 2018/01/08 修正: ele_inner_text -> ele.inner_text                           补充: ...