C语言中的一个关于求正方形个数的算法题目
2013-06-14 23:27
246 查看
这是一个经典的C语言算法题目,题目是给出一个给定的图形,根据这幅图形里的作标可以求出这幅图形一共可有构成多少个正方形。
例如下面这个图形:
下面是解题思路:首先采用组合算法,得出这些顶点一共能构成多少个有四个顶点构成的四边形,并列出每一个四边形,然后用一个子函数对这四边形进行判断,若是正方形就加一,这样就可以得出一共含有多少个正方形。
具体代码:
#include<stdio.h>
#include<math.h>
/*输入的图形的顶点数量,一定要输入正确的顶点数量,修改这个值可以得到不同的点情况下的
正方形数量*/
#define N 13
#define B ((N*(N-1)*(N-2)*(N-3))/(4*3*2))
typedef struct{
int x;
int y;
}Point;
typedef struct{
Point a[4];
}Squre;
Point dian
;
Point queue[4]; /*存放矩形坐标*/
Squre tmp;
int k=0;
int top=0;
void comb(int s,int n,int m);
int function(Squre s);
int main(void){
int i=0;
int num=(int)B;
printf("%d",num);
for(i=0;i<N;i++){
printf("\nplease input the %d zuo biao :",i+1);
scanf("%d %d",&dian[i].x,&dian[i].y);
}
comb(0,N,4);
printf("the sum of sibianxing are %d\n",k);
getch();
return 0;
}
/*判断是不是正方形,若是返回1,否则返回0*/
int function(Squre s){
int e,b,c,d,k;
e=pow((s.a[0].x-s.a[1].x),2)+pow((s.a[0].y-s.a[1].y),2);
b=pow((s.a[0].x-s.a[2].x),2)+pow((s.a[0].y-s.a[2].y),2);
if(e>b){ /*e作为对角线存在*/
c=pow((s.a[2].x-s.a[1].x),2)+pow((s.a[1].y-s.a[2].y),2);
d=pow((s.a[3].x-s.a[1].x),2)+pow((s.a[3].y-s.a[1].y),2);
k=pow((s.a[0].x-s.a[3].x),2)+pow((s.a[0].y-s.a[3].y),2);
if((b==c)&&(c==d)&&(d==k)&&(k==b)&&(e==(b+c)))
return 1;
}else if(e==b){
c=pow((s.a[1].x-s.a[3].x),2)+pow((s.a[1].y-s.a[3].y),2);
d=pow((s.a[2].x-s.a[3].x),2)+pow((s.a[2].y-s.a[3].y),2);
k=pow((s.a[1].x-s.a[2].x),2)+pow((s.a[1].y-s.a[2].y),2);
if((e==c)&&(c==d)&&((e+b)==k))
return 1;
}else { /*b作为对角线存在*/
c=pow((s.a[2].x-s.a[1].x),2)+pow((s.a[1].y-s.a[2].y),2);
d=pow((s.a[3].x-s.a[2].x),2)+pow((s.a[3].y-s.a[2].y),2);
k=pow((s.a[0].x-s.a[3].x),2)+pow((s.a[0].y-s.a[3].y),2);
if((e==c)&&(c==d)&&(d==k)&&(k==e)&&(b==(e+c)))
return 1;
}
return 0;
}
/*组合算法:用于得到可能构成正方形的矩形集合
m代表选取的个数就是组合数C(m,n),从n中选取m个点
并返回正方形数量*/
void comb(int s,int n,int m)
{
int i,j=0;
if(s>n) return ;
if(top==m) {
for(i=0;i<m;i++){
tmp.a[i]=queue[i];
}
j=function(tmp);
if(j==1){
k++;
}
return ;
}
queue[top++]=dian[s];
comb(s+1,n,m);
top--;
comb(s+1,n,m);
}
例如下面这个图形:
下面是解题思路:首先采用组合算法,得出这些顶点一共能构成多少个有四个顶点构成的四边形,并列出每一个四边形,然后用一个子函数对这四边形进行判断,若是正方形就加一,这样就可以得出一共含有多少个正方形。
具体代码:
#include<stdio.h>
#include<math.h>
/*输入的图形的顶点数量,一定要输入正确的顶点数量,修改这个值可以得到不同的点情况下的
正方形数量*/
#define N 13
#define B ((N*(N-1)*(N-2)*(N-3))/(4*3*2))
typedef struct{
int x;
int y;
}Point;
typedef struct{
Point a[4];
}Squre;
Point dian
;
Point queue[4]; /*存放矩形坐标*/
Squre tmp;
int k=0;
int top=0;
void comb(int s,int n,int m);
int function(Squre s);
int main(void){
int i=0;
int num=(int)B;
printf("%d",num);
for(i=0;i<N;i++){
printf("\nplease input the %d zuo biao :",i+1);
scanf("%d %d",&dian[i].x,&dian[i].y);
}
comb(0,N,4);
printf("the sum of sibianxing are %d\n",k);
getch();
return 0;
}
/*判断是不是正方形,若是返回1,否则返回0*/
int function(Squre s){
int e,b,c,d,k;
e=pow((s.a[0].x-s.a[1].x),2)+pow((s.a[0].y-s.a[1].y),2);
b=pow((s.a[0].x-s.a[2].x),2)+pow((s.a[0].y-s.a[2].y),2);
if(e>b){ /*e作为对角线存在*/
c=pow((s.a[2].x-s.a[1].x),2)+pow((s.a[1].y-s.a[2].y),2);
d=pow((s.a[3].x-s.a[1].x),2)+pow((s.a[3].y-s.a[1].y),2);
k=pow((s.a[0].x-s.a[3].x),2)+pow((s.a[0].y-s.a[3].y),2);
if((b==c)&&(c==d)&&(d==k)&&(k==b)&&(e==(b+c)))
return 1;
}else if(e==b){
c=pow((s.a[1].x-s.a[3].x),2)+pow((s.a[1].y-s.a[3].y),2);
d=pow((s.a[2].x-s.a[3].x),2)+pow((s.a[2].y-s.a[3].y),2);
k=pow((s.a[1].x-s.a[2].x),2)+pow((s.a[1].y-s.a[2].y),2);
if((e==c)&&(c==d)&&((e+b)==k))
return 1;
}else { /*b作为对角线存在*/
c=pow((s.a[2].x-s.a[1].x),2)+pow((s.a[1].y-s.a[2].y),2);
d=pow((s.a[3].x-s.a[2].x),2)+pow((s.a[3].y-s.a[2].y),2);
k=pow((s.a[0].x-s.a[3].x),2)+pow((s.a[0].y-s.a[3].y),2);
if((e==c)&&(c==d)&&(d==k)&&(k==e)&&(b==(e+c)))
return 1;
}
return 0;
}
/*组合算法:用于得到可能构成正方形的矩形集合
m代表选取的个数就是组合数C(m,n),从n中选取m个点
并返回正方形数量*/
void comb(int s,int n,int m)
{
int i,j=0;
if(s>n) return ;
if(top==m) {
for(i=0;i<m;i++){
tmp.a[i]=queue[i];
}
j=function(tmp);
if(j==1){
k++;
}
return ;
}
queue[top++]=dian[s];
comb(s+1,n,m);
top--;
comb(s+1,n,m);
}
相关文章推荐
- C语言中的一个关于求正方形个数的算法题目
- 2015年华为面试用C语言编写一个求大数字阶乘算法的题目
- [转贴] 一个关于C语言字串有趣的小题目
- 一个关于字符串匹配的算法题目
- 一个关于SQL语句的练习题目
- C语言:一个有趣的算法总结。
- C语言中的一个关于基本类型的输出问题
- C语言——以尽量高效的方法用”*”打印出一个空心正方形
- 【C语言提高21】关于字符串的一个例题
- 【算法题】题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 求总共有多少总跳法,并分析算法的时间复杂度
- [C语言]关于指针和int型的一道题目
- 关于一个简单shellcode封装成C语言的形式
- 一个算法题目,初中信息学奥赛的复赛题
- c语言 很蛋疼的一个关于买鸡问题
- (第20讲)关于排序的各种算法的汇总的题目
- 京东2016实习题目-选举游戏-小东和其他小朋友正在玩一个关于选举的游戏。选举是通过投票的方式进行的,得票最多的人将获胜。
- 关于C语言For循环的一个问题~!
- c语言int to string一个比较经典得算法
- 关于问答区里面的一个算法问题