/*设黑洞的只为1 其他为0 预处理出每一行每一列的前缀和
然后查询的时候根据方向去判断某一段的和是否大于零
*/
#include<bits/stdc++.h>
#define ll long long;
using namespace std;
char s[1007][1007];
int a[1007][1007];
int b[1007][1007];
int num[1007][1007];
int main()
{
int n,m,q,ans=0;
int x,y;
char c[10];
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='*')
num[i][j]=0;
else
num[i][j]=1;
}
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)//记录矩阵a中第i行第1个数到第j个数的和
{
a[i][j]=a[i][j-1]+num[i][j];
}
}
for(int j=1;j<=m;j++)//b[i][j]记录矩阵b中第j列第1个数到第i个数的和
for(int i=1;i<=n;i++)
b[i][j] = b[i-1][j]+num[i][j];
while(q--)
{
scanf("%d%d%s",&x,&y,&c[0]);
if(c[0]=='U')
{
if(b[x][y]==0) puts("YES");
else puts("NO");
}
if(c[0]=='D')
{
if(b[n][y]-b[x][y]==0) puts("YES");
else puts("NO");
}
if(c[0]=='L')
{
if(a[x][y]==0) puts("YES");
else puts("NO");
}
if(c[0]=='R')
{
if(a[x][m]-a[x][y]==0) puts("YES");
else puts("NO");
}
}
}
西南民族大学题解
最新推荐文章于 2023-11-08 22:02:57 发布