天天看點

UVa201

/*      
本題按照題意,設定兩個二維數組,分别記錄水準連接配接和垂直連接配接即可。      
最坑的地方在于垂直連接配接時候,是先輸入列,再輸入行,這點注意。      
*/      
#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;      
}