您的位置:首页 > 其它

UVA201(p96)----Squares

2016-02-29 17:27 525 查看
#include<bits/stdc++.h>
#define debu
using namespace std;
int n,m,cas=0;
int r[20][20],c[20][20];
void solve()
{
int l,all=0;
for(l=1; l<=n; l++)
{
int num=0,flag;
for(int i=1; i+l<=n; i++)
for(int j=1; j+l<=n; j++)
{
flag=1;
for(int R=j; R<j+l; R++)
if(!r[i][R]||!r[i+l][R]) flag=0;
for(int C=i; C<i+l; C++)
if(!c[C][j]||!c[C][j+l]) flag=0;
num+=flag;
}
all+=num;
if(num)
printf("%d square (s) of size %d\n",num,l);
}
if(!all) printf("No completed squares can be found.\n");
}
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
while(scanf("%d%d\n",&n,&m)!=EOF)
{
cas++;
if(cas!=1) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",cas);
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
for(int i=0; i<m; i++)
{
int x,y;
char flag;
scanf("%c%d%d\n",&flag,&x,&y);
if(flag=='H')  r[x][y]=1;
else c[y][x]=1;
}
solve();
}
return 0;
}

题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=137

题解:枚举每一点(i,j),判断从(i,j)到(i,j+l-1)和(i+l,j)到(i+l,j+l-1)(横行,竖行同)是否有边即可。注意竖行的y,x相反。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: