UVa 201 Squares 枚举
题意:
有n行n列的小黑点,还有m条边连接这些小黑点,统计这些线段连接成几个正方形。
分析:
枚举每个点,看看以这个点为右下角的正方形是否可以,然后枚举边长,控制正方形的大小,判断是否可以构成正方形使用map记录边,然后查询就可以。
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
typedef pair<int,int>pii;
map<pii,int>mp,mpp;
int ans[11];
int main()
{
int n,m,x,y;
char op[2];
int cas=0;
//freopen("f.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d",&n)){
mp.clear();mpp.clear();
memset(ans,0,sizeof(ans));
scanf("%d",&m);
while(m--){
scanf("%s%d%d",op,&x,&y);
if(op[0]=='H'){
mp[pii(x,y)]=1;
}
else mpp[pii(x,y)]=1;
}
// cout<<mp.size()<<' '<<mpp.size()<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int s=1;s<min(i,j);s++){
if(mp.count(pii(i,j-s))&&mpp.count(pii(j,i-s))){
//cout<<i<<' '<<j<<endl;
bool flag=1;
for(int x=i-s,y=j-s;x<i&&y<j;x++,y++){
if(mp.count(pii(i-s,y))&&mpp.count(pii(j-s,x)))continue;
else{flag=0;break;}
}
if(flag)
ans[s]++;
}
else break;
}
}
}
if(cas){
printf("\n**********************************\n\n");
}
printf("Problem #%d\n\n",++cas);
bool flag=1;
for(int s=1;s<=n;s++){
if(ans[s]){
printf("%d square (s) of size %d\n",ans[s],s);
flag=0;
}
}
if(flag)printf("No completed squares can be found.\n");
}
return 0;
}