題目鏈接
題意
給出一個平面,詢問可以構成多少個正方形
解決
- 注意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");
}
}