网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月30日漏签0天
c++吧 关注:630,888贴子:2,113,926
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 3 下一页 尾页
  • 128回复贴,共3页
  • ,跳到 页  
<<返回c++吧
>0< 加载中...

怎么判断由4个顶点连接成的图形是正方形?图中有多少个正方形?

  • 只看楼主
  • 收藏

  • 回复
  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

在这张图中,有41个顶点.
最终目的是要求图中有多少个正方形,
目前我的构想是把这些顶点用坐标表示出来(我打算用struct),然后从这41个顶点的每四个一组的所有可能的组合中判断有多少个可以组成正方形,然后再想办法除掉四个顶点都一样的重复计算的.
这样一来就可以算出来有多少个正方形了.
哪位大神帮帮忙,看看用什么类型来表示顶点的坐标合适?
还有,判断四个顶点是否能组成正方形的函数怎么写?//最关键的,有一种设想是
怎么计算被重复计数的?我有一个设想就是用所有的符合正方形条件的个数除以24,因为ABCD四个顶点能有24种方式出现,但是这种方法必须要求前面所有的组合方式都要出现,这样会对效率有较大影响,貌似是41^4=2825761种可能的情况,但是我现在补虑效率,
要求四个顶点的任意排序方式必须有且仅有一次出现.例如ABCD四个顶点组合成24种方式


  • tcet030840zxp
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
sort hash


2025-08-30 03:54:00
广告
不感兴趣
开通SVIP免广告
  • ringsqure
  • ^
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个命题有意思,希望大家一起来探讨一下~
我有个想法:
以一个基本正方形的边长为距离1,从初始顶点开始,派一个小松鼠沿着边进行搜索,沿途留下标记;
当小松鼠走过距离为4,又回到了之前走过的点,那么这四个点构成的是正方形;
考虑到正方形有大有小,可以通过改变距离的值来确定正方形,如设定两个基本正方形的边长为距离1....
小松鼠的走法可以广度法也可以深度法......
大致思想就这样,其中有很多细节漏洞需要考虑到


  • tcet030840zxp
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
hdu,poj多年的老题了。。。原题有几千个点


  • 碧目神君
  • ==
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我觉得没有那么复杂 楼主思路不对


  • ashuralyk
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有一个问题,图中的顶点只有41个,如果把大正方形的每一个小正方形的边长记为1,那图中间的8个边长为0.5的正方形算不算?如果用四个顶点来标示正方形的话,边长为1正方形尅表示,但那8个边长为0.5的正方形就只能有2个顶点来表示,这就有问题了。


  • 管家光
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
两个点,XY坐标相减,长宽相等就是正方形了,就算有误差,也不会超过很多.POINT结构那样存点就好了. 你这个麻烦的地方在于要存点与点之间的连接关系.不然可能数出图里不存在的正方形.


  • wjc19881117
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我觉得可以先把这个图形表示为一个“树”结构,然后根据每个结点间的关系,再加上正方形判断的相关函数,这样是不是可以做出来。
我数据结构刚学到线性表和单链表,后面的树,图都还没看,而且我是个菜鸟,不知道能否实现,这是偶的想法。


2025-08-30 03:48:00
广告
不感兴趣
开通SVIP免广告
  • wjc19881117
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主,有结果了,把代码共享一下啊。求学习。


  • wjc19881117
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
忘记留QQ了,楼主,问题解决了,求共享下代码啊,偶也要学习一下。先谢谢了。QQ 976006737


  • 西尔瑞斯之王
  • throw
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
40个


  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//dev-a_square ,关于判断是否为正方形的函数。
#include <cstdlib>
#include <iostream> using namespace std; struct ve// square.vertex
{
int x;
int y;
};
bool a_square(ve a,ve b,ve c,ve d)
{
ve e;
//寻找a点的对角点,只要bcd中有一点与a不在同一直线上即可
if((a.x!=b.x )&&(a.y!=b.y))
{
cout<<"b may be a diagonal"<<endl;
//为了方便后续比较另外两个顶点与与这两个顶点的关系,
//将对角与b交换位置,此处正好是b所以无需交换
}
else
{
if((a.x!=c.x )&&(a.y!=c.y))
{
cout<<"c may be a diagonal"<<endl;
e=c;//c与b的位置交换
c=b;
b=e;
}
else
{
if((a.x!=d.x )&&(a.y!=d.y))
{
cout<<"d may be a diagonal"<<endl;
e=d;
d=b;
b=e;
}
else
{
// cout<<"abcd不可能组成正方形";
return 0;
}
}
}
//下面来判断cd和ab能否组成正方形。
if( ((c.x==a.x) && (c.y==b.y) //c和d的其中一个点的x为a的x,y为b的y
&&(d.x==b.x) && (d.y==a.y)) //另一个点的x为b的x,y为a的y
|| ((d.x==a.x) && (d.y==b.y)
&&(c.x==b.x) && (c.y==a.y)) )
{
//cout<<"abcd为正方形"<<endl;
return 1;
}
else
{
// cout<<"abcd不可能组成正方形";
return 0;
}
}
int main(int argc, char *argv[])
{
ve array[4]={{2,4},{4,4},{4,2},{2,2}};//测试
a_square(array[0],array[1],array[2],array[3]);
system("PAUSE");
return EXIT_SUCCESS;
}


  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//dev_c++,关于让所有可能的排列方式的实现
#include <cstdlib>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
int n=0,t=41;//n记录所有的组合,t为元素个数
for(int a=0;a<t;a++)
{
for (int b=0;b<t;b++)
{
for(int c=0;c<t;c++)
{
for(int d=0;d<t;d++)
{
//cout<< a<<"_"<<b<<"_"<<c<<"_"<<d<<endl;
n++;
}
}
}
}
cout<<t<<"中取4有"<<n<<"种排列"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}


  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
再将这两个片断整合,求出可以组合成正方形的数N,然后用N/24就可以排除所有的重复计数的了,大功告成。后续我会贴出整合后的代码。请各位大师不吝指教。


2025-08-30 03:42:00
广告
不感兴趣
开通SVIP免广告
  • 西尔瑞斯之王
  • throw
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
标记,以后看看完整代码~


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 下一页 尾页
  • 128回复贴,共3页
  • ,跳到 页  
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示