NC14739. 星图
描述
输入描述
单组输入。第一行三个正整数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; }