您的位置:首页 > 理论基础 > 计算机网络

2017年西南民族大学程序设计竞赛-网络同步赛 A 星图【思维维护】

2017-12-30 17:41 281 查看

A 星图

题目描述

现在有一个N*M的矩形星图。其中包括恒星和黑洞。恒星可以向上、下、左、右发射光束,且允许光束从其中穿过;黑洞会吸收所有经过的光束。

若一颗恒星向上、下、左、右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么?

输入描述:

单组输入。第一行三个正整数N,M,Q(1 <= N,M

<= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立。

然后一个N*M的矩阵,由’’和’#’构成,表示星图。’’表示恒星,’#’表示黑洞。

最后Q行,表示Q个询问,每行两个正整数x,y(1 <= x <= N, 1 <= y

<= M)表示发光恒星的位置(从上往下数第x行,从左往右数第y列,且保证该位置一定是恒星)和一个字符p(p∈{‘L’, ‘R’,

‘D’, ‘U’},’R’表示向右;’L’表示向左;’D’表示向下’;’U’表示向上)表示该恒星产生光束的方向。

输出描述:

一共Q行。对于每个询问,若该恒星发出的光束能够进入星图之外的区域则输出“YES”;否则输出“NO”。(不包含引号)

示例1

输入

4 5 5
**##*
*****
*#*#*
##**#
2 3 D
2 3 U
1 5 R
4 4 U
3 1 U


输出

YES

NO

YES

NO

YES

题意 : 已知*为恒星,#为黑洞,给你某个恒星的坐标,和发射方向,问你能否被黑洞吸收

分析: 我们可以维护每行列的最大小值,然后O(1)查询即可

参考代码

#include<bits/stdc++.h>

using namespace std;

char E[1010][1010];
int hang[1010][3];
int lie[1010][3];

int main(){
ios_base::sync_with_stdio(0);
init();
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i = 0;i < n;i++)
scanf("%s",E[i]);
for(int i = 0;i < n;i++) {
int l = INF,r = -INF;
for(int j = 0;j < m;j++) {
if(E[i][j] == '#') {
l = min(j,l);
r = max(j,r);
}
}
hang[i][0] = l;
hang[i][1] = r;
}
for(int i = 0;i < m;i++) {
int l = INF,r = -INF;
for(int j = 0;j < n;j++) {
if(E[j][i] == '#') {
l = min(j,l);
r = max(j,r);
}
}
lie[i][0] = l;
lie[i][1] = r;
}
while (q--) {
int x,y;
char c;
scanf("%d %d %c",&x,&y,&c);
x--;y--;
bool flg = false;
if(c == 'L') {
if(hang[x][0] < y) {
flg = true;
}
}
if(c == 'R') {
if(hang[x][1] > y) {
flg = true;
}
}
if(c == 'D') {
if(lie[y][1] > x) {
flg = true;
}
}
if(c == 'U') {
if(lie[y][0] < x) {
flg = true;
}
}
if(flg) printf("NO\n");
else printf("YES\n");
}
return 0;
}


如有错误或遗漏,请私聊下UP,ths
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐