题目背景
“codeplus比赛的时候在做什么?有没有空?能来解决停机问题吗?”qmqmqm这样问sublinekelzrip。
当然,sublinekelzrip并不会停机问题,所以qmqmqm改为提出了另一个题目,现在请你帮助sublinekelzrip解决这个题目。
题目描述
这个问题是这样的:
对于任何一个
n
阶方阵,若任意从其中选择
现在有一个
n×m
大小的矩阵
M
以及
输入格式
从标准输入读入数据。
输入第一行包含三个正整数 n,m,T 。
之后
n
行每行
之后
输出格式
输出到标准输出。
输出包含
T
行每行一个字符Y
或者N
。Y
表示被询问的方阵是巧妙的,N
表示不是。
样例1输入
3 3 4
1 1 1
1 1 1
1 1 2
1 1 2
1 1 3
2 2 2
2 1 2
样例1输出
Y
N
N
Y
子任务
测试点 | 其他 | |
---|---|---|
1 | ||
8 | 无 | |
9 | ||
10 |
对于所有的数据,
分析:
这道题和之前hu测的T2有点像
通过手玩,我们可以发现:
一个合法的大矩阵中任意一个子矩阵都满足条件
实际上我们也可以把一个大矩阵拆成若干个2*2的小矩阵
判断每个小矩阵是否符合条件
暴力判断即可
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=505;
int a[N][N],n,m,Q,x,y,nn;
int solve(int x,int y,int n)
{
for (int i=x;i<x+n-1;i++)
for (int j=y;j<y+n-1;j++)
if (a[i][j]+a[i+1][j+1]!=a[i][j+1]+a[i+1][j]) return 0;
return 1;
}
int main()
{
memset(sum,0,sizeof(sum));
scanf("%d%d%d",&n,&m,&Q);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
int x;
scanf("%d",&a[i][j]);
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+x;
}
for (int i=1;i<=Q;i++)
{
scanf("%d%d%d",&x,&y,&nn);
if (solve(x,y,nn)) printf("Y\n");
else printf("N\n");
}
return 0;
}