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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

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

  • 图片

  • 吧主推荐

  • 游戏

  • 5回复贴,共1页
<<返回c++吧
>0< 加载中...

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

  • 取消只看楼主
  • 收藏

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

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


  • 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;
}


2025-08-30 05:46:00
广告
不感兴趣
开通SVIP免广告
  • 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就可以排除所有的重复计数的了,大功告成。后续我会贴出整合后的代码。请各位大师不吝指教。


  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//dev-a_square
#include <cstdlib>
#include <iostream>
#include <math.h> using namespace std; struct ve// square.vertex
{
int x;
int y;
};
ve array[41]={ //以左下角为原点,构造矩阵
{0,0},{2,0},{4,0},{6,0},{8,0},
{0,2},{2,2},{4,2},{6,2},{8,2},
{0,4},{2,4},{4,4},{6,4},{8,4},
{0,6},{2,6},{4,6},{6,6},{8,6},
{0,8},{2,8},{4,8},{6,8},{8,8},
{3,1},{3,2},{3,3},{3,5},{3,6},{3,7},
{4,1},{4,3},{4,5},{4,7},
{5,1},{5,2},{5,3},{5,5},{5,6},{5,7}
};
int n=0,n_end=0; 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;
}
if( //这一句是最关键的,貌似就错在这里了,哪位大侠帮忙看看...
(abs(a.x-b.x))==(abs(d.y-c.y))//相邻的两条边长度相等 的矩形是正方形
||(abs(a.y-b.y))==(abs(c.x-d.x))
)
{
/*******
cout<<"("<<a.x<<","<<a.y<<")"<<" and "<<
"("<< b.x<<","<<b.y<<")"<<" and "<<
"("<<c.x<<","<<c.y<<")"<<" and "<<
"("<< d.x<<","<<d.y<<")"<<" 四点是图中的正方形之一 "<< endl;
*********/
return 1;
}
else
{
// cout<<"abcd不可能组成正方形";
return 0;
}
}
int main(int argc, char *argv[])
{
int t=41;//t=sizeof(array)/sizeof(ve)
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++)
{
if(a_square(array[a],array,array[c],array[d]))
{
n++;
}
}
}
}
}
n_end=(n/24)-1;//扣掉 (3,3),(3,5),(5,3),(5,5)这个没有连通的.
cout<<"这个图中有"<<n_end<<"个正方形"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}


  • goodganggang
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//dev-a_square
#include <cstdlib>
#include <iostream>
#include <math.h>using namespace std;struct ve// square.vertex
{
int x;
int y;
};
ve array[41]={ //以左下角为原点,构造矩阵
{0,0},{2,0},{4,0},{6,0},{8,0},
{0,2},{2,2},{4,2},{6,2},{8,2},
{0,4},{2,4},{4,4},{6,4},{8,4},
{0,6},{2,6},{4,6},{6,6},{8,6},
{0,8},{2,8},{4,8},{6,8},{8,8},
{3,1},{3,2},{3,3},{3,5},{3,6},{3,7},
{4,1},{4,3},{4,5},{4,7},
{5,1},{5,2},{5,3},{5,5},{5,6},{5,7}
};
int n=0,n_end=0; bool a_square(ve a,ve b,ve c,ve d)
{
ve e;
if(//四个点中任意两个点都不能相同,否者就不够4个顶点了.
( (a.x==b.x) &&(a.y==b.y) ) ||
( (a.x==c.x) &&(a.y==c.y) ) ||
( (a.x==d.x) &&(a.y==d.y) ) ||
( (c.x==b.x) &&(c.y==b.y) ) ||
( (d.x==b.x) &&(d.y==b.y) ) ||
( (c.x==d.x) &&(c.y==d.y) )
)
{
return 0;
}
//寻找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;
}
else
{
return 0;
}
if( //验证临边是否相等
(abs(a.x-b.x)) ==(abs(a.y-b.y))//a点和b点是对角
)
{
/*******
cout<<"("<<a.x<<","<<a.y<<")"<<" and "<<
"("<< b.x<<","<<b.y<<")"<<" and "<<
"("<<c.x<<","<<c.y<<")"<<" and "<<
"("<< d.x<<","<<d.y<<")"<<" 四点是图中的正方形之一 "<< endl;
/*********/
return 1;
}
else
{
// cout<<"abcd不可能组成正方形";
return 0;
}
}
int main(int argc, char *argv[])
{
int t=41;//t=sizeof(array)/sizeof(ve)
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++)
{
if(a_square(array[a],array,array[c],array[d]))
{
n++;
}
}
}
}
}
n_end=(n/24)-1;//扣掉 (3,3),(3,5),(5,3),(5,5)这个没有连通的.
cout<<"这个图中有"<<n_end<<"个正方形"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}


登录百度账号

扫二维码下载贴吧客户端

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