《算法竞赛入门经典》习题4-2 正方形

有n行n列(2<=n<=9)的小黑点,还有m条线段连接其中的一些黑点。统计这些线段连成了多少正方形。(每种边长分别统计)。
行从上到下编号为1~ n,列从左到右编号为1~n。边用H i j和V i j表示,分别代表(i,j)-(i,j+1)和(i,j)-(i+1,j)。
(具体题目:https://blog.csdn.net/ramay7/article/details/50363125)

#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
int h[11][11],v[11][11];
int main()
{
	int n,m,t=0,x,y;
	char a;
	while(scanf("%d%d",&n,&m)!=EOF) 
	{
		getchar(); //防止把回车当成字符 
		memset(h,0,sizeof(h));
		memset(v,0,sizeof(v));
		for(int i=0;i<m;i++)
		{
			scanf("%c%d%d",&a,&x,&y);
			getchar(); //防止把回车当字符 
			if(a=='H')	h[x][y]=1; //记录线段 
			else  v[x][y]=1;
		}
		if(t++)
			printf("\n**********************************\n\n");
		printf("Problem #%d\n\n",t);
		int size,cnt;
		int flag=0; //判断有没有正方形 
		for(size=1;size<n;size++) //边长最大为n-1 
		{
			cnt=0;
			for(int i=1;i<=n-size;i++)  //因为i+size<=n
			{                            //并且每次都从左上角开始 
				for(int j=1;j<=n-size;j++) //因为j+size<=n
				{
					int is=1;
					for(int jj=j;jj<j+size;jj++) //判断正方形上下有没有边 
					{
						if(!h[i][jj]||!h[i+size][jj])  is=0;
					}
					for(int ii=i;ii<i+size;ii++) //判断正方形左右有没有边 
					{
						if(!v[ii][j]||!v[ii][j+size]) is=0; 
					}
					if(is)  cnt++; //如果有正方形,个数加一 
				}
			}
			if(cnt)
			{
				flag=1; //记录有正方形 
				printf("%d square (s) of size %d\n",cnt,size);
			}
		}
		if(!flag)
			printf("No completed squares can be found.\n");
	}
	return 0;
}

(どうして私は毎日お腹がすいているのですか。)

猜你喜欢

转载自blog.csdn.net/weixin_43326028/article/details/84726533
今日推荐