题目背景
深蓝的天空中挂着一轮金黄的明月,下面是海边的沙地,都种着一望无际的碧绿的 potato……
YeahPotato 种了一块 nn 行 mm 列的土豆田,田中每一格都种着一个 potato。 然而,有些 potato 变异成了 yeahpotato。
为了研究这些变异物种,YeahPotato 需要在土豆田内选一块非空矩形区域保护起来。YeahPotato 将会进行 yeahpotato 人工授粉杂交实验以研究它们的相对性状,所以需要矩形里有至少两个 yeahpotato。
题目描述
土豆田可以抽象成一个 n×mn×m 的 0101 矩阵,若一个位置为 00,则代表这个土豆没变异,否则为 11,代表变异了。
YeahPotato 需要你求出,这个矩阵中有多少个连续的子矩阵包含 ≥2≥2 个 11。这里,连续的子矩阵指选取矩阵的一段连续的行和一段连续的列并提取出所有行与列都分别在选择的行列范围中的元素构成的子矩阵。参见样例以获得更好的理解。
输入格式
本题有多组数据。第一行一个正整数 TT,表示数据组数。
接下来 TT 行每行四个整数 n,m,t,seedn,m,t,seed。
由于 YeahPotato 已进入大规模工业化生产阶段,所以他的土豆田很大,以至于他担心你的代码会在读入上花费太多时间。因此,你需要通过以下代码获得 0101 矩阵:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned int uint;
int T, n, m, t; uint seed;
bool a[5005][5005];
uint Rand(uint &x) {
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
return (x & 65535) < t;
}
int main() {
scanf ("%d", &T);
int num,count,ff;
while (T --) {
int res=0;
scanf ("%d%d%d%u", &n, &m, &t, &seed);
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
a[i][j] = Rand(seed);
/* Code your solution here. */
num=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
{
for (int aa=1; aa<=n; aa++)
for (int b=1; b<=m; b++){
count=0;
ff=0;
for (int c=i; c<=aa; c++)
for (int d=j; d<=b; d++){
if(a[c][d]==1){
count++;
if(count>=2){
//num++;
ff=1;
break;
}
}
}
if(ff==1)num++;
}
}
cout<<num<<endl;
} return 0;
}