有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;
}
(どうして私は毎日お腹がすいているのですか。)