时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个N x M的矩阵,请你数一数其中有多少个3 x 3的子矩阵可以构成三阶幻方?
如果3 x 3的矩阵中每一行、每一列和两条对角线上的3个数之和都相等,我们就认为其构成一个三阶幻方。
输入
第一行包含两个整数N和M。(1 ≤ N, M ≤ 100)
以下N行M列包含一个N x M的矩阵A。(1 ≤ Aij ≤ 100)
输出
输出矩阵中包含多少个三阶幻方。
- 样例输入
-
5 5
4 9 2 1 8
3 5 7 6 2
8 1 6 9 3
2 3 3 6 9
5 6 9 3 6 - 样例输出
-
2
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int a[][];
bool check(int u,int v)
{
int res=,tmp;
for(int i=;i<;i++) res+=a[u][v+i];
for(int i=;i<;i++) {
tmp=;
for(int j=;j<;j++) tmp+=a[u+i][v+j];
if(tmp!=res) return false;
}
for(int i=;i<;i++){
tmp=;
for(int j=;j<;j++) tmp+=a[u+j][v+i];
if(tmp!=res) return false;
}
tmp=a[u][v]+a[u+][v+]+a[u+][v+];
if(tmp!=res) return false;
tmp=a[u][v+]+a[u+][v+]+a[u+][v];
if(tmp!=res) return false;
return true;
}
int main()
{
int n,m,i,j,ans;
while(~scanf("%d%d",&n,&m)){
ans=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&a[i][j]); for(i=;i<=n-;i++)
for(j=;j<=m-;j++)
if(check(i,j)) ans++; printf("%d\n",ans);
}return ;
}