【问题描述】
给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大 N × M) 满足子矩阵中所有数的和不超过给定的整数 K?
【输入格式】
第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数,代表矩阵 A.
【输出格式】
一个整数代表答案。
【样例输入】
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
【分析】
看见题,有点头大,唯一想道的只有通过枚举来一遍遍找,这样的话,要用到6个循环,可行但是不太好。首先要循环完成 1*1、1*2、…N*M所有子矩阵,完了找每个可以作为子矩阵的第一个坐标点,再将子矩阵里的每一个点相加判断。
【代码】
int Data(int N,int M){
int x=0,y=0;
int all=0,al=0;
for (int i=0;i<N;i++)
{
for (int j=0;j<M;j++)
{
for (int x=0;x+i<N;x++)
{
for(int y=0;y+j<M;y++)
{
for(int z=0;z<=i;z++)
{
for (int h=0;h<=j;h++){
al += n[x+z][y+h];
}
}
if (al<=K){
all++;
}
al = 0;
}
}
}
}
return all;
}
【思考】
代码可以遍历所有正确的子矩阵,但是使用了6个for循环,如果矩阵增大,运行时间大大增加。