判断一个正方形点阵图中正方形的个数
有点麻烦,时间复杂度为n^4.目前想到的优化是可以用邻接矩阵做一个,以后再写吧
#include<stdio.h>
#include<string.h>
int H[10][10]; //横边
int V[10][10]; //竖边
int main(void) {
int sum = 0,n;
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
FILE *fp = fopen("e4.2.txt","r");
int x,y,countH,countV;
fscanf(fp,"%d",&n);
fscanf(fp,"%d",&countH);
for(int i=0;i<countH;i++) { //添加横边
fscanf(fp,"%d %d",&x,&y);
H[x-1][y-1] = 1;
}
fscanf(fp,"%d",&countV);
for(int i=0;i<countV;i++) { //添加竖边
fscanf(fp,"%d %d",&x,&y);
V[x-1][y-1] = 1;
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
int edge = i>j?n-i+1:n-j+1; //点到边界的距离
for(int k=1;k<edge;k++) { //判断边长为k的正方形是否存在(最大为edge)
int flag = 1;
int a = i,b = j; //记录下当前点的位置
while(a<i+k) { //判断竖线
if(V[a][b]==0 || V[a][b+k]==0) flag = 0; //判断边是否存在
a++;
}
a = i;
while(b<j+k) { //判断横线
if(H[a][b]==0 || H[a+k][b]==0) flag = 0;
b++;
}
if(flag) sum++;
}
}
}
printf("%d",sum);
}