翻译 + 题解
2024-04-06 12:17:25
发布于:陕西
24阅读
0回复
0点赞
翻译:
你有一个 矩阵。里面有多少个正方形?其中正方形的边用 表示。我们现在只对这些正方形感兴趣:
第一种:每条边与矩阵的边平行的正方形;
第二种:每条边与矩阵的对角线平行的正方形。
例如下面的正方形有且只有一个正方形(第一种):
0000000
0111100
0100100
0100100
0111100
下面的正方形有且只有一个正方形(第二种):
0000000
0010000
0101000
0010000
0000000
一个正方形必须包含一个 而且边和角不能接触别的 。当然,这是一个正方形,每条边的长度应该相等。
矩阵里有多少个正方形?
【输入格式】
第一行是一个整数 (),表示这个测试点测试数据的组数。接下来是每组测试数据。每组测试数据的第一行有两个整数 (), 是行数 是列数。接下来 行每行 个字符(0
或 1
)。
每组测试数据字符总数不超过 。
对任何测试点都适用。
【输出格式】
输出正好 行,对应每组测试数据的答案。
题解:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 255;
int n,m;
int xx[8] = {-1,1,0,0,-1,-1,1,1};
int yy[8] = {0,0,-1,1,-1,1,-1,1};
char s[N][N];
int dfs_1(int x,int y) {
int a = 1,b = 1,c = 1,d = 1;
while(x+1<=n&&s[x+1][y]=='1') x++,a++;
while(y+1<=m&&s[x][y+1]=='1') y++,b++;
while(x-1>0&&s[x-1][y]=='1') x--,c++;
while(y-1>0&&s[x][y-1]=='1') y--,d++;
if(a==b&&c==d&&a==c) return a;
return 0;
}
int dfs_2(int x,int y) {
int a = 1,b = 1,c = 1,d = 1;
while(x+1<=n&&y-1>0&&s[x+1][y-1]=='1') x++,y--,a++;
while(x+1<=n&&y+1<=m&&s[x+1][y+1]=='1') x++,y++,b++;
while(x-1>0&&y+1<=m&&s[x-1][y+1]=='1') x--,y++,c++;
while(x-1>0&&y-1>0&&s[x-1][y-1]=='1') x--,y--,d++;
if(a==b&&b==c&&c==d) return a;
return 0;
}
int dfs_3(int x,int y) {
s[x][y] = '0';
int w = 1;
for(int i=0; i<8; i++) {
int dx = x+xx[i],dy = y+yy[i];
if(dx>0&&dx<=n&&dy>0&&dy<=m&&s[dx][dy]=='1')
w+=dfs_3(dx,dy);
}
return w;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int ans = 0;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%s",s[i]+1);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(s[i][j]=='1') {
int a = dfs_1(i,j);
int b = dfs_2(i,j);
int w = dfs_3(i,j);//返回(i,j)连通块1的个数.
if(w==4*(a-1)||w==4*(b-1)) ans++;
}
printf("%d\n",ans);
}
return 0;
}
这里空空如也
有帮助,赞一个