博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中的一个关于求正方形个数的算法题目
阅读量:5038 次
发布时间:2019-06-12

本文共 2029 字,大约阅读时间需要 6 分钟。

这是一个经典的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[N];
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);
}

 

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/14/3136979.html

你可能感兴趣的文章
C#inSSIDer强大的wifi无线热点信号扫描器源码
查看>>
「Foundation」集合
查看>>
算法时间复杂度
查看>>
二叉树的遍历 - 数据结构和算法46
查看>>
类模板 - C++快速入门45
查看>>
[转载]JDK的动态代理深入解析(Proxy,InvocationHandler)
查看>>
centos7 搭建vsftp服务器
查看>>
RijndaelManaged 加密
查看>>
Android 音量调节
查看>>
HTML&CSS基础学习笔记1.28-给网页添加一个css样式
查看>>
windows上面链接使用linux上面的docker daemon
查看>>
Redis事务
查看>>
Web框架和Django基础
查看>>
python中的逻辑操作符
查看>>
CSS兼容性常见问题总结
查看>>
HDU 1548 A strange lift (Dijkstra)
查看>>
每天一个小程序—0005题(批量处理图片大小)
查看>>
C# 启动进程和杀死进程
查看>>
tcp实现交互
查看>>
IIS的各种身份验证详细测试
查看>>