题意翻译

有一个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. 通过已有Nginx镜像创建私有仓库

    想搭建一个私有的Docker仓库,查看了各种资料,大多是使用Nginx做代理.但是因为对于Nginx不熟悉,各种关于权限认证的问题,折腾了两天也没有搞定.后来无意在网上看到一篇使用已有镜像的方法,最终 ...

  2. to prof. Choi

    Dear Prof. Choi It is my great pleasure to receive your reply ,but terribly sorry for my late reply ...

  3. POJ 1663:Number Steps

    Number Steps Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13758   Accepted: 7430 Des ...

  4. Olddriver’s books

    Olddriver 的书多的吓人,什么算法导论,组合数学英 文版(orz)......他把 n 本书都放在身后的桌子上, 每本书有一定的面积,并且书可以覆盖,求 n 本书覆盖桌面 的面积 输入格式: ...

  5. IJ:IJ笔记1

    ylbtech-IJ:IJ笔记1 1. 下拉框返回顶部 1. <form:select id="type" path="baseId" class=&qu ...

  6. Django day31 contentType组件,Django的缓存

    一.contentType组件 1.干什么用的? 是一个django内置的一个组件,方便我们快速的连表操作 2.这两个字段都不会在数据库中生成,他只是用来查询,插入的 -在course表中: poli ...

  7. 【转】深入理解Java多态原理

    之前一直知道多态是什么东西,平时敲代码也经常用到多态,但一直没有真正了解多态底层的运行机制到底是怎么样的,这两天才研究明白点,特地写下来,跟各位同学一起进步,同时也希望各位大神指导和指正. 多态的概念 ...

  8. Mac 的可清除空间(时间机器)

    最近项目引入新技术flutter 所以需要更新xcode,下载完了xcode,安装不上 ,费解半天,提示磁盘空间不足.如下图,看到剩余九十多个G, 怎么都解决不了这个问题 就是买磁盘情理软件clean ...

  9. Java中static方法

    今天学习到了并且应用到了java中的静态方法,并且了解到它的好处与缺点. ● 生命周期(Lifecycle): 静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装 ...

  10. Django总结二

    - 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...