UVa201

来源:互联网 发布:c语言软件测试 编辑:程序博客网 时间:2024/05/22 04:36
/*
本题按照题意,设置两个二维数组,分别记录水平连接和垂直连接即可。
最坑的地方在于垂直连接时候,是先输入列,再输入行,这点注意。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<vector>
#include<utility>
#include<unordered_set>
#include<unordered_map>
#include<string.h>
using namespace std;
//#define nmax 10000
//auto fin=fopen("UVa.in","r");
//int cmp(const void *a,const void *b){return *(int *)a<*(int *)b;}
int vlink[11][11],hlink[11][11];
int is_squ(int x,int y,int v){
    for(int i=x;i<x+v;++i){
        if(vlink[i][y]==0||vlink[i][y+v]==0)return 0;
    }
    for(int i=y;i<y+v;++i){
        if(hlink[x][i]==0||hlink[x+v][i]==0)return 0;
    }
    return 1;
}
void printm(){
    for(int i=1;i<10;++i){
        for(int j=1;j<10;++j)printf("%3d",hlink[i][j]+vlink[i][j]);
        printf("\n");
    }
}
int main()
{
    char s[10];
    int cnt[11];
    int n,m,x,y,flag,kase=0;
    while(scanf("%d%d",&n,&m)==2&&n){
        flag=1;
        memset(cnt,0,sizeof(cnt));
        memset(vlink,0,sizeof(vlink));
        memset(hlink,0,sizeof(hlink));
        for(int i=0;i<m;++i){
            scanf("%s%d%d",s,&x,&y);
            if(s[0]=='H')hlink[x][y]=1;
            if(s[0]=='V')vlink[y][x]=1;
        }
        //printm();
        for(int x=1;x<n;++x){
            for(int y=1;y<n;++y){
                for(int v=1;v<=min(n-x,n-y);++v){
                    if(is_squ(x,y,v))++cnt[v];
                }
            }
        }
        if(kase++)printf("\n**********************************\n\n");
        printf("Problem #%d\n\n",kase);
        for(int i=1;i<n;++i){
            if(cnt[i]>0){
                flag=0;
                printf("%d square (s) of size %d\n",cnt[i],i);
            }
        }
        if(flag)printf("No completed squares can be found.\n");
    }
    return 0;
}