精华内容
下载资源
问答
  • 最近点对问题用c语言实现

    千次阅读 2018-09-28 22:36:36
    #include #include #include ...t = (zuobiao[i].x-zuobiao[j].x)*(zuobiao[i].x-zuobiao[j].x)+(zuobiao[i].y-zuobiao[j].y)*(zuobiao[i].y-zuobiao[j].y);...printf("\n最近的距离为:%lf\n",zuijin()); }

    #include<stdio.h>

    #include<math.h>

    #include<stdlib.h>

    #define MAX 100

    struct {

    int x,y;

    }zuobiao[MAX];

    double zuijin()

    {

    int i,j,t;

    int d=100;

    int n=rand()%100+1;

    printf("随机生成的点数为: %d\n",n);

    for(i=0;i<n;i++){

    zuobiao[i].x=rand()%100+1;

    zuobiao[i].y=rand()%100+1;

    printf("(%d,%d)     ",zuobiao[i].x,zuobiao[i].y);

    }

    for (i = 0; i <n+1; i++)

    for (j=i+1; j < n; j++) {

    t = (zuobiao[i].x-zuobiao[j].x)*(zuobiao[i].x-zuobiao[j].x)+(zuobiao[i].y-zuobiao[j].y)*(zuobiao[i].y-zuobiao[j].y);

    if(d*d>t)d=t;

    }

    return sqrt(d);

    }

    void main() {

    printf("\n最近的距离为:%lf\n",zuijin());

    }

    展开全文
  • c语言 分治法求解最近点对问题

    千次阅读 2018-10-22 21:13:33
    最近对问题(二维平面上的点),编程实现用分治法求解。 最近点对算法: double cpair2(S) {  n=|S|;  if (n &lt; 2) return 0; 1)、m=S中各点x坐标的中位数;  //构造S1和S2;  S1={p∈S|x(p)&...

    最近对问题(二维平面上的点),编程实现用分治法求解。

    最近点对算法:

    double cpair2(S)

    {

          n=|S|;

          if (n < 2) return 0;

    1)、m=S中各点x坐标的中位数;

         //构造S1S2

         S1={pS|x(p)<=m},

         S2={pS|x(p)>m}

    2)、d1=cpair2(S1);

          d2=cpair2(S2);

    3)dm=min(d1,d2);

    4)、设P1S1中距垂直分割线l的距离在dm之内的所有点组成的集合;

       P2S2中距分割线l的距离在dm之内所有点组成的集合;

       将P1P2中点依其y坐标值排序;

       并设XY是相应的已排好序的点列;

    5)、通过扫描X以及对于X中每个点检查Y中与其距离在dm之内的所有点(最多6)可以完成合并;

       当X中的扫描指针逐次向上移动时,Y中的扫描指针可在宽为2dm的区间内移动;

       设dl是按这种扫描方式找到的点对间的最小距离;

    6)d=min(dm,dl);

          return d;

    }

    具体代码:

    #include<stdio.h>

    #include<math.h>

    #include<stdlib.h>

    #define min(x,y) (x<y)?x:y

    #define MAX 100

    struct zuobiao{

    int x,y;

    }z[MAX];

    double distance(zuobiao z1,zuobiao z2)

    {

    double t;

    t=(z1.x-z2.x)*(z1.x-z2.x)+(z1.y-z2.y)*(z1.y-z2.y);

    return sqrt(t);

    }

    double fenzhi(zuobiao s[],int left,int right) {

        if (right-left == 1) {

            return distance(s[right], s[left]);

        }

        if (right - left == 2) {

            double d1 = distance(s[right], s[left]);

            double d2 = distance(s[right], s[left+1]);

            double d3 = distance(s[left+1], s[left]);

            d2 = min(d1, d2);

            d3 = min(d2, d3);

            return d3;

        }

        int m = (right+left) / 2;

    int i,j;

        double d1 = fenzhi(s,left, m);

        double d2 = fenzhi(s, m+1,right);

        double d = min(d1, d2);

        int l = left, r = right;

        while (s[l].x < s[m].x - d && l <= right);

            l++;

        while (s[r].x > s[m].x + d && r>=left)

            r--;

        double d3;

        for (i = l; i <=r; i++) {

            for (j = i+1;j<=r; j++) {

                if (s[j].y - s[i].y >= d) {

                    break;

                }

                else {

                    d3 = distance(s[i], s[j]);

                    if (d3 < d)

                        d = d3;

                }

            }

        }

        return d;

    }

    void main()

    {

    int i,j;

    int n=rand()%10+5;

    printf("随机生成的点数为: %d\n",n);

    for(i=0;i<n;i++){

    z[i].x=rand()%100+1;

    z[i].y=rand()%100+1;

    for(j=0;j<i;j++){

    if(z[j].x==z[i].x&&z[j].y==z[i].y){

    i--;

    break;

    }

    }

    }

    for(i=0;i<n;i++){

    printf("(%d,%d)     ",z[i].x,z[i].y);

    }

    printf("\n最近点对最小距离为 %lf\n",fenzhi(z,0,n-1));

    }

    结果截图:

     

     

     

     

     

     

     

    展开全文
  • ####最近用C语言写数组循环左移时出现了一个问题:用while循环输入字符进不去循环,以下是原题目和代码: 循环左移问题 题目内容: 设计分治算法实现将字符数组A[n]中所有元素循环左移k个位置,例如,abcdefgh...

    此篇笔记仅仅只是作为零散的知识点记录以及记录下自己在学习过程中遇见的一些问题并提供了解决方案

    最近在用C语言写数组循环左移时出现了一个问题:
    用while循环输入字符进不去循环,以下是原题目和代码:
    循环左移问题
    题目内容:
    设计分治算法实现将字符数组A[n]中所有元素循环左移k个位置,例如,对abcdefgh循环左移3位得到defghabc。

    输入格式:

    第一行为数组长度n

    第二行为循环左移数k

    第三行为数组中元素

    输出格式:

    循环左移k个位置后的结果

    输入样例:

    8

    3

    abcdefgh

    输出样例:

    defghabc

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        int n;  //数组长度
        int k;  //左移位数
        char a[100];
        int i,j;
        char temp;  //保存数据
        scanf("%d",&n);  //输入数组长度
        scanf("%d",&k);  //输入左移位数
        i=0;            
        while((a[i]=getchar())!='\n')
            i++;
        a[i]='\0';
        for(j=0;j<k;j++){  //左移次数
            temp=a[0];   //保留首位
            for(i=0;i<n;i++){
                a[i]=a[i+1];
                if(i==n-1)
                    a[i]=temp;
            }
        }
        for(i=0;a[i]!='\0';i++){
            if(i==n-1)
                putchar(a[i]);
            else
                putchar(a[i]);
        }
    
        return 0;
    }
    
    

    程序运行结果发现,并不能正确的输入数组,经过调试,找到问题——while循环并没有进行,程序跳过while循环进行下一步(っ °Д °;)っ emmmm问题出在哪里?
    然后我感觉问题出在回车字符上面,于是就百度了一下,看了一遍scanf函数和getchar()函数的使用:
    scanf()
    在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
    C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。两个数据之间的分隔符被从缓冲区读出但是不起任何作用,但是最后一个’\n '会被留在缓冲区内,除非用getchar();或scanf("%c",&c);把它读出来。

    getchar()
    getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符. 用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

     scanf("%d",&n);  //输入数组长度
        scanf("%d",&k);  //输入左移位数
        i=0;
        while((a[i]=getchar())!='\n')
            i++;
        a[i]='\0';
    

    在这段代码中,用scanf函数输入k值后,我按下回车键作为分隔符,那么这个回车字符已经存放在缓冲区,当下一步进行while循环时,getchar()读取缓冲区的字符,首先读取了 回车字符,循环终止,无法正确输入字符数组
    解决方案有两种:
    第一种:

        scanf("%d",&n);  //输入数组长度
        scanf("%d",&k);  //输入左移位数
        getchar();   //或者替换为  fflush(stdin);  同样起清除缓存的作用
        i=0;
        while((a[i]=getchar())!='\n')
            i++;
        a[i]='\0';
    

    在while循环前加一行代码:getchar();或者fflush(stdin); 两者作用结果相同。前者将’\n’从缓冲区中读出,后者将’\n’从缓冲区中清除。运行结果如下:
    在这里插入图片描述

    第二种:

        scanf("%d",&n);  //输入数组长度
        scanf("%d",&k);  //输入左移位数
        for(i=0;i<n;i++)
            scanf("%s",&a[i]);
    

    使用scanf()输入数组,结果运行如下:
    在这里插入图片描述
    需要注意的是,用scanf输入字符数组时,需要输入一个字符之后用回车作为它与下一个字符之间的分隔符,但是getchar则需要连续输入

    笔记到此就结束了。如果哪里有问题,欢迎大家指出,我会马上修改,感谢!d=====( ̄▽ ̄*)b

    展开全文
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。 综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以...
  • C语言提供了多种语句来实现这些程序结构。 本章介绍这些基本语句及其应用,使读者C程序有一个初步的认识, 为后面各章的学习打下基础。 C程序的语句 C程序的执行部分是由语句组成的。 程序的功能也是由执行...
  • 10.2.2 最近点问题 10.2.3 选择问题 10.2.4 一些运算问题的理论改进 10.3 动态规划 10.3.1 一个表代替递归 10.3.2 矩阵乘法的顺序安排 10.3.3 最优二叉查找树 10.3.4 所有点对最短路径 ...
  • 14.2.5 距离最近点对 454 14.3 解递归方程 462 14.4 复杂性的下限 463 14.4.1 最小最大问题的下限 464 14.4.2 排序算法的下限 465 第15章 动态规划 467 15.1 算法思想 467 15.2 应用 469 15.2.1 0/1背包问题 469 ...
  • 数据结构与算法分析—C语言描述 高清版

    千次下载 热门讨论 2008-04-05 21:01:56
    10.2.2 最近点问题 10.2.3 选择问题 10.2.4 一些运算问题的理论改进 10.3 动态规划 10.3.1 一个表代替递归 10.3.2 矩阵乘法的顺序安排 10.3.3 最优二叉查找树 10.3.4 所有点对最短路径 10.4 随机化算法 10.4.1 ...
  • 小结

    2016-01-27 20:19:07
    对于我来说,经常接触的就面相对象和面相过程了,其实对象的方法就是利用面相过程的思维将其封装起来,再外界提供接口,我们都知道OC的底层就是用C语言来封装的。因为我刚开始接触的计算机语言是C语言,而利用...

    好久没用写博客了,最近一直在做项目所以没有时间整理一下这段时间做项目积累或者碰到的一些问题。今天记下的不是一些知识点,而是对于OC或者这种面相对象思想的一些小的感悟。
    对于我来说,经常接触的就面相对象和面相过程了,其实对象的方法就是利用面相过程的思维将其封装起来,再对外界提供接口,我们都知道OC的底层就是用C语言来封装的。因为我刚开始接触的计算机语言是C语言,而利用C语言来实现一些问题就完全是面相过程来实现问题,也就是说我们在实现问题的时候要考虑每一个步骤,每一个步骤的具体的做法,只有这样我们才可以把问题解决。但是当我们用面向过程的思维方式来处理面相对象的语言时,我们就会发现一个很大的问题,我们常常会进入死胡同,这是我在刚刚接触OC的时候遇到的问题,我会把C语言的思维方式用到OC中,这样在解决问题时出现一些困扰。
    有这样的一个例子,是我在刚刚学习OC时遇到的,也是我在面向过程和面向对象之间发生转变的经历,当时我要做一个电话薄的程序(不是UI),利用OC来模拟电话薄的增删改查的功能,但是当我开始做的时候,我就完全不知道怎样去处理这种问题,完全搞不懂每个对象之间的逻辑关系,正是我这时候是利用的面向过程的思想来考虑的问题,弄的我思路混乱。
    唉,这个仅供咱们初学者分享了

    展开全文
  • 考研复试准备中学习总结

    热门讨论 2018-01-21 11:18:34
    前言  自从考研结束后,很多人呢已经开始了复试的准备,当然我也是其中的一员,每天都是复试科目的学习,我没有忘记养成写...2上机用C语言编写一点小的程序,实现某些功能;3面试,提问一些本科学的知识;准确来
  • 数据结构(一)— 数组的操作最近开始学习数据结构,觉得这门课蛮重要的,不论是刷题还是写安卓,数据结构还是要学好的,学习数据结构,我还是用c语言实现,好理解一点。数据结构之数组定义数据结构中最基本的一个...
  • 算法 第四版

    2019-04-15 14:33:04
    【有C语言基础即可,自己去搜索下如何Java写出Hello World就没有问题】 大二,推荐这本书从头到尾好好读一遍,做下上千道的课后习题 【后面的有点小难度,但是难度不大值得一做,听起来很多的样子,用心去做,...
  • windows 程序设计

    2011-07-24 21:16:30
    这些程序用C语言编写并使用原始的Windows Application Programming Interface(API)。如在本章稍后所讨论的,这不是写作Windows程序的唯一方法。然而,无论最终您使用什么方式写作程序,了解Windows API都是非常...
  • 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和...
  • VB课程设计俄罗斯方块

    热门讨论 2011-02-25 10:46:55
    由于时间的紧促,在设计中,也许会有一些考虑不周之处,但其功能已经能够满足大多用户的需求,相信假以时日,一定能做出一个更经典,更完美的俄罗斯方块游戏,下面我们将每一步的具体如何实现展示给大家。...
  • 已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序——程序设计与C语言引论》(1999) [同作者作品] 计算机基础教程(上下)...
  • 最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。  ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用...
  • 已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序——程序设计与C语言引论》(1999) [同作者作品] 计算机基础教程(上下)...
  • 最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。  ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用...
  • 不久,Thompson和Ritchie成功地说服管理部门为他们购买更新的机器,以便该开发小组可以实现一个文本处理系统,Unix就在PDP-11上用C语言重新编写(发明C语言的部分目的就在于此)。它果真变成了一个文本处理系统—...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序——程序设计与C语言引论》(1999) [同作者作品] 计算机基础教程(上下)...
  • 不过,有些游戏(特别是Wolf 3D 和 Doom)采用了用C语言编写的庞大核心引擎(Doom的引擎就有10万行代码),而且注释很少,因此很难读懂。总而言之,最重要的是你会看到如何不费劲地将这两种绝妙的语言(Java 和C)...
  • 疯狂的程序员

    热门讨论 2012-07-18 18:05:32
    他同学给他打电话说要打印资料,绝影在电话这头说:“打什么打?拿给我到公司去打,不要钱的。”其实在学校外头激光打印,每张A4是3毛钱,到那家公司,就是6块钱,不过因为他是代理,就给他算4块钱。这时他才...
  • 简明批处理教程22009年10月20日 星期二 下午 05:35 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

最近点对问题用c语言实现

c语言 订阅