UVA201正方形squares

本文介绍了一种通过水平线和竖直线信息来计算特定区域内所有可能的正方形数量的算法。该算法首先读取输入的线段信息,并将其存储在二维数组中。随后通过两层循环枚举正方形的每个可能的左上角顶点,并检查是否存在对应的右侧和下侧的顶点,以此判断能否构成正方形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用两个数组存水平线和竖直线,然后先枚举正方形的边长,然后对于每个边长枚举方格内的所有顶点,对于每个顶点,向右枚举处于同一水平边和对边的点,向下枚举处于同一竖直边和对边的点,如果枚举过程中任何一个顶点未在对应数组中有记录,说明该点不存在连线,自然不可组成正方形,否则遍历能正常结束,说明所有点都有连线,计数加1,输出当前边长的正方形数

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

ios::sync_with_stdio(false);

int v[11][11],h[11][11]; //分别存竖直线和水平线

int m,n,k=0;

while(k++,cin>>n>>m)

{

bool noans=true; //标记是否有正方形

memset(v,0,sizeof(v));

memset(h,0,sizeof(h));

char mode;

int a,b;

for(int i=0;i<m;i++)

{

cin>>mode>>a>>b;

if(mode=='H')

h[a][b]++; //将线段信息存入数组

else

v[b][a]++; //这里按照紫书的描述应该是v[a][b],但是原题不是这样。。。坑

}

if(k!=1)

cout<<endl<<"**********************************"<<endl<<endl;

cout<<"Problem #"<<k<<endl<<endl;

for(int s=1;s<n;s++) //枚举边长

{

int cont=0;

for(int i=1;i<=n-s;i++) //枚举左上顶点

for(int j=1;j<=n-s;j++)

{

bool mark=true; //标记当前顶点是否可能有当前边长的正方形

for(int x=i,y=j;mark&&x<i+s;x++)

if(!v[x][y]||!v[x][y+s]) //任何一点无连线则不可能组成正方形

mark=false;

for(int x=i,y=j;mark&&y<j+s;y++)

if(!h[x][y]||!h[x+s][y])

mark=false;

if(mark) //可组成正方形则当前边长正方形数量累加

cont++;

}

if(cont)

{

cout<<cont<<" square (s) of size "<<s<<endl;

noans=false;

}

}

if(noans) //无结果

cout<<"No completed squares can be found."<<endl;

}

 

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值