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;
}
posted @ 2016-04-09 11:58  HARD_UNDERSTAND  阅读(739)  评论(0编辑  收藏  举报