题干:
给定一个N x M的矩阵,请你数一数其中有多少个3 x 3的子矩阵可以构成三阶幻方?
如果3 x 3的矩阵中每一行、每一列和两条对角线上的3个数之和都相等,我们就认为其构成一个三阶幻方。
Input
第一行包含两个整数N和M。(1 ≤ N, M ≤ 100)
以下N行M列包含一个N x M的矩阵A。(1 ≤ Aij ≤ 100)
Output
输出矩阵中包含多少个三阶幻方。
Sample Input
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
Sample Output
2
解题报告:
直接暴力就好了啊。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int maze[105][105];
bool fit(int x,int y) {
int a[10];
a[1]=maze[x][y]+maze[x+1][y]+maze[x+2][y];a[2]=maze[x][y+1]+maze[x+1][y+1]+maze[x+2][y+1];a[3]=maze[x][y+2]+maze[x+1][y+2]+maze[x+2][y+2];
a[4]=maze[x][y]+maze[x][y+1]+maze[x][y+2];a[5]=maze[x+1][y]+maze[x+1][y+1]+maze[x+1][y+2];a[6]=maze[x+2][y]+maze[x+2][y+1]+maze[x+2][y+2];
a[7]=maze[x][y]+maze[x+1][y+1]+maze[x+2][y+2];a[8]=maze[x][y+2]+maze[x+1][y+1]+maze[x+2][y];
for(int i = 1; i<=8; i++) {
if(a[i] != a[1]) return 0;
}
return 1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=m; j++) {
scanf("%1d",&maze[i][j]);
}
}
if(n < 3 || m < 3 ) {
printf("0\n");return 0 ;
}
int ans = 0;
for(int i = 1; i<=n-2; i++) {
for(int j = 1; j<=m-2; j++) {
if(fit(i,j)) ans++;
}
}
printf("%d\n",ans);
return 0 ;
}