1. 程式人生 > >《演算法競賽入門經典》習題4-2 正方形

《演算法競賽入門經典》習題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;
}

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