算法分析与设计

圆排列问题

问题描述:

给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列。

算法

假设三个圆的半径分别为1,1,2。那么这种情况的圆排列长度为2+4sqrt(2)。计算r1=1,r2=2情况下的两圆心的距离为len2=(r1+r2)2-(r2-r1)^2。推广到所有情况就可以得到len=2sqrt(r1*r2)。


这是n=3时,圆A,圆B,圆C的排列数的情况。ABC,ACB,BCA,BAC,CAB,CBA。圆排列问题的解空间是一颗排列树。按照回溯法搜索排列树的算法框架,设开始时r=[r1,r2,…,rn]是所给的n个圆的半径,则相应的排列树由r[1:n]的所有排列构成。
compute函数:可以想象其中任意的一个圆无限大或无限小,无限大的话那其余的圆就可以统统忽略了。已知所有圆的x[]和r[],求出每个圆的左右坐标,通过比较找出最小的左部坐标和最大的右部坐标,想减就是该圆排列的长度,每次更新出最小的minn。

核心代码:

double Getc(int t) {         //计算第t个圆的圆心坐标double temp = 0;for (int j = 1; j < t; ++j) {double val = x[j] + 2.0 * sqrt(r[t] * r[j]);  //判断与他之前的所有圆相切的情况temp=max(temp,val);}return temp;
}
void compute() {double L = inf, R = 0;   //L是左边界,R是有边界for (int i = 1; i <= n; ++i) {if (x[i] - r[i] < L)L = x[i] - r[i];if (x[i] + r[i] > R)R = x[i] + r[i];}if (R - L < minn) {minn = R - L;for (int i = 1; i <= n; ++i)arr[i] = r[i];}
}
void dfs(int t) {if (t == n + 1) {compute();}else {for (int j = t; j <= n; ++j) {swap(r[t], r[j]);double val = Getc(t);if (val + r[t] + r[1] < minn) {x[t] = val;dfs(t + 1);}swap(r[t], r[j]);     //还原}}
}

时间复杂度:

算法遍历解空间,时间复杂度为O(n!)。
每次计算圆排列长度,此时的时间复杂度为O(n)。
综上,该算法的时间复杂度为O(n!*n)。

源码:

https://github.com/SpiritDemon-max/myText/blob/master/circle.cpp

算法分析大作业 圆排列问题相关推荐

  1. 算法-大作业-圆排列问题

    1.问题 给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列. 2.解析 圆的摆放位置不同,得到的结果可能不同,所以这是一个排列问题,在回溯里面需要添加全排列的代 ...

  2. 算法大作业 圆排列问题

    问题 圆排列问题:给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列. 解析 圆排列问题的解空间是一棵排列树.按照回溯法搜索排列树的算法框架,设开始时a=[r1, ...

  3. 计算机软件大作业,计算机软件基础大作业

    学习计算机的基础题,可自己联系. <计算机软件基础>大作业 一.C语言的数据类型有哪些?类型标示符本别是什么? 二.C语言关系运算符和逻辑运算符分别有哪些?关系表达式的运算结果有哪两个值? ...

  4. 数字图像处理大作业实验报告

        <数字图像处理> 期末大作业 班    级:数字媒体技术2020级1班 姓    名:快乐的小蓝 学    号:XXXXXXXXX XXXX大学信息学院 目录 一.任务描述 二.设 ...

  5. java泡泡龙开源_2019级C语言大作业 - 泡泡龙

    分享19级同学大一上学期用C语言实现的泡泡龙.分步骤代码.可执行程序可从百度网盘下载: 提取码:jcuc C语言大作业 - 泡泡龙https://www.zhihu.com/video/1207418 ...

  6. 北京交通大学Python课程设计大作业(四)——典籍词频统计

    北京交通大学Python课程设计大作业(四)--典籍词频统计 文章目录 北京交通大学Python课程设计大作业(四)--典籍词频统计 一.词频统计任务介绍 二.典籍词频统计python源代码如下 三. ...

  7. 汇编语言笔记(待更新大作业)

    文章目录 前言 计算机系统基础 概述 微处理器/中央处理器(CPU) 概述 性能指标与总线 前端总线(Front Side Bus) 带宽 数据总线DB/地址总线AB/控制总线CB CPU软件特性与指 ...

  8. 数字图像处理期末大作业-美图秀秀

    本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址:htt ...

  9. 南京工程学院C++/VC程序设计大作业

    南京工程学院C++/VC程序设计大作业 源码下载 链接:源码下载链接 提取码:1111 学生成绩输入及统计分析 模拟自动取款机 C++/VC程序设计大作业任务书 一.课外大作业要求: 1.每人从附件1 ...

最新文章

  1. js 操作json对象增删改
  2. [WP]关于WP7的后台的一些小事情
  3. 解决在配置Oracle数据库连接错误问题
  4. Android中实现照片滑动时左右进出的动画的xml代码
  5. chrome webdriver_(最新版)如何正确移除Selenium中的 window.navigator.webdriver
  6. 二叉排序树查找不成功的平均查找长度
  7. Shell编程之一:Shell基础编程
  8. python大神的程序_6年Python大神总结10个开发技巧,80%的人都不会
  9. Bailian4067 回文数字(Palindrome Number)【数学】
  10. CMD/Dos下远程开启3389与远程改3389端口
  11. Xfce 4.4 beta2
  12. 怎么自学java_菜鸟如何自学Java
  13. 视频解码芯片GM7150BC功能CVBS转BT656/601低功耗替代TVP5150
  14. 2018 蓝桥杯省赛 A 组模拟赛(一) 青出于蓝胜于蓝
  15. 广告创意设计都有哪些类型
  16. html5 360度图像查看,HTML5 Canvas实现360度全景图
  17. Windows商店安装问题已解决 Xbox应用将改善游戏安装
  18. 赛门铁克如何用TAA搞定APT?
  19. ios Objective-c 获取省市区工具
  20. c语言:输入长和宽计算长方形周长和宽

热门文章

  1. 买卖提将养的一缸金鱼分五次出售系统上一次卖出全部的一半加二分之一条; 第二次卖出余下的三分之一加三分之一条; 第三次卖出余下的四分之一加四分之一条; 第四次卖出余下的五分之一加五分之一条; 最后卖出余
  2. 周易六十四卦——复卦
  3. 基于可编程超表面的雷达通信一体化系统
  4. 对于KSWEB使用心得
  5. 【蓝桥杯】给定圆的半径r,求圆的面积。
  6. echarts地图城市标注,较完整版本
  7. 简简单单写个二叉树路径和likou112
  8. 内存快照:宕机后,Redis如何实现快速恢复?
  9. app开发周期需要多久 开发一个app要多长时间
  10. Flutter高仿微信-视频演示