题目链接
题意
给出一个平面,询问可以构成多少个正方形
解决
- 注意V的i,j是反的
- 题意要求长度从小到大输出,我们就枚举长度
- 枚举长度之后枚举左上角
- 判断正方形是否存在
- 注意输出格式
#include<bits/stdc++.h>
using namespace std;
int H[10][10],V[10][10];
bool judge(int i, int j, int len) //判断以i,j为左上角,长度为l的正方形是否存在
{
for(int k=0;k<len;k++){
if(H[i][j+k]==0||H[i+len][j+k]==0) return false;
if(V[i+k][j]==0||V[i+k][j+len]==0) return false;
}
return true;
}
int main()
{
int n,m,t=1;
char ch;
while(~scanf("%d%d",&n,&m))
{
if(t!=1) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",t++);
int a,b;
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
for(int i=0 ; i<m; i++)
{
getchar();
scanf("%c",&ch);
scanf("%d%d",&a,&b);
if(ch=='H') H[a][b] = 1;
if(ch=='V') V[b][a] = 1;
}
int sum=0;
for(int l=1;l<10;l++) //从小到大枚举长度
{
int ans = 0;
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++) //枚举左上角的点
{
if(judge(i,j,l)) ans++;
}
}
if(ans) printf("%d square (s) of size %d\n",ans,l);
sum+=ans;
}
if(!sum) printf("No completed squares can be found.\n");
}
}