列表

详情


NC14739. 星图

描述


现在有一个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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 712ms, 内存消耗: 5152K, 提交时间: 2021-12-05 20:23:40

#include<stdio.h>

char c[1001][1001];
int main() {
	int n, m, q;
	scanf("%d %d %d\n", &n, &m, &q);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m + 1; j++) {
			char c2 = getchar();
			if (c2 == '*' || c2 == '#') { c[i][j] = c2; }
			else break;
		}
	}
	while(q--) {
		int y, x, yes = 1;
		char d;
		scanf("%d %d %c", &y, &x, &d);
		if (d == 'U') while (y > 0) if (c[--y][x] == '#') { yes = 0; break; }
		if (d == 'D') while (y < n) if (c[++y][x] == '#') { yes = 0; break; }
		if (d == 'L') while (x > 0) if (c[y][--x] == '#') { yes = 0; break; }
		if (d == 'R') while (x < m) if (c[y][++x] == '#') { yes = 0; break; }
		printf(yes ? "YES\n" : "NO\n");
	}
}

C++ 解法, 执行用时: 598ms, 内存消耗: 5240K, 提交时间: 2021-10-29 16:11:25

#include<stdio.h>
char wc[1005][1005];
int main()
{
    char ch;
    int N,M,i,j,k,Q,a,b,ljx=0;
    scanf("%d%d%d",&N,&M,&Q);
    for(i=1;i<=N;i++){
            scanf("%s",wc[i]+1);
    }
    for(k=1;k<=Q;k++){
        scanf("%d%d",&a,&b);
        scanf(" %c",&ch);
        if(ch=='U')for(;a>0;a--)if(wc[a][b]=='#')ljx++;
        if(ch=='D')for(;a<=N;a++)if(wc[a][b]=='#')ljx++;
        if(ch=='L')for(;b>0;b--)if(wc[a][b]=='#')ljx++;
        if(ch=='R')for(;b<=M;b++)if(wc[a][b]=='#')ljx++;
        if(ljx==0)printf("YES\n");
        else ljx=0,printf("NO\n");
    }
    return 0;
}

上一题