UVa201 Squares

判断一个正方形点阵图中正方形的个数

有点麻烦,时间复杂度为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);
}

点赞