暴力法解决最近对问题和凸包问题-实现可视化

2024-05-10 22:20

本文主要是介绍暴力法解决最近对问题和凸包问题-实现可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

最近对问题

凸包问题


最近对问题

顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。

大概思路就是如图(每个圈代表一个数对)

第一个和其他四个比较

第二个和其他三个比较

.......

最后比较最小的

image-20240510191434898

代码

图形化界面主要是easyx的graphics

#include<iostream>
#include <fstream>
#include<graphics.h>
#include <conio.h>
using namespace std;
#define Max 20  //20个点的凸包问题
#define maxn 10000
#define time 15
​
typedef struct {int a;int b;
}point;
void draw_point(point x[]);
void draw_line(int a, int b, int c, int d);
void judge(point x[]);
​
int main() {point x[Max];
​ifstream in("a.txt");cout << "从txt中读取点坐标如下:" << endl;for (int i = 0; i < 20; i++){in >> x[i].a;in >> x[i].b;}for (int i = 0; i < 20; i++){cout << i + 1 << ":" << "(" << x[i].a << "," << x[i].b << ")" << endl;}cout << endl << endl;in.close();cout << "存储的数据如下:" << endl;draw_point(x);judge(x);getchar();return 0;
}
​
void judge(point x[]) {int i, j, a, b, c, n, num1 = 0, num2 = 0;int flag;for (i = 0; i < Max; i++){for (j = i + 1; j < Max; j++){b = x[i].a - x[j].a;a = x[j].b - x[i].b;c = x[i].a * x[j].b - x[j].a * x[i].b;
​for (n = 0; n < Max; n++){if (n != i && n != j){flag = x[n].a * a + x[n].b * b;if (flag < c)num1++;else if (flag > c)num2++;else {num1++;num2++;};}}if (num1 == 18 || num2 == 18){cout << "如下两点是极边:" << "(" << x[i].a << "," << x[i].b << ")" << "(" << x[j].a << "," << x[j].b << ")" << endl;draw_line(x[i].a, x[i].b, x[j].a, x[j].b);}num1 = num2 = 0;}}
​
}
void draw_point(point x[]) {initgraph(880, 680, SHOWCONSOLE);setorigin(320, 240);int a, b;for (int i = 0; i < Max; i++) {a = x[i].a * time;b = x[i].b * time;fillcircle(a, b, 4);}
}
void draw_line(int a, int b, int c, int d)
{line(a * time, b * time, c * time, d * time);
}

运行结果

先写一个a.txt文件的点(20个)

img

运行(可视化界面)

img

凸包问题

凸包问题就是在一个有n个点集的平面上,找出所有的“极点”,这些极点所构成的边界能够把其他所有的点都能包含在内。

思路

由两个点连起来的直线会将平面分成两部分,其中半个平面的点都满足ax+by>c ,另一半平面中的点都满足ax+by<c ,对于线上的点来说满足ax+by=c。因此,算法的思路就是对于每个点带入ax+by-c,判断表达式结果的符号是否相同即可。

代码

#include<iostream>
#include<fstream>
#include<graphics.h>
#include<cmath>
#include<algorithm>
using namespace std;
​
#define Max 20 // 最大点数
#define maxn 10000
#define time 15
​
typedef struct {int a;int b;
} point;
​
void draw_point(point x[]);
void draw_line(int a, int b, int c, int d);
void closest_pair(point x[]);
​
int main() {point x[Max];
​
ifstream in("points.txt"); 
cout << "从txt文件中读取点坐标:" << endl;for (int i = 0; i < Max; i++) {in >> x[i].a;in >> x[i].b;}for (int i = 0; i < Max; i++) {cout << i + 1 << ": (" << x[i].a << ", " << x[i].b << ")" << endl;}cout << endl << endl;in.close();
​cout << "存储的数据如下:" << endl;draw_point(x);closest_pair(x);getchar();closegraph(); // 关闭图形窗口return 0;
}
​
void closest_pair(point x[]) {int min_distance = INT_MAX;int pair1 = -1, pair2 = -1;
​for (int i = 0; i < Max; i++) {for (int j = i + 1; j < Max; j++) {int distance = pow(x[i].a - x[j].a, 2) + pow(x[i].b - x[j].b, 2);if (distance < min_distance) {min_distance = distance;pair1 = i;pair2 = j;}}}
​cout << "最近的点对:" << endl;cout << "(" << x[pair1].a << ", " << x[pair1].b << ") 和 (" << x[pair2].a << ", " << x[pair2].b << ")" << endl;
​// 绘制最近的点对连线draw_line(x[pair1].a, x[pair1].b, x[pair2].a, x[pair2].b);
}
​
void draw_point(point x[]) {initgraph(880, 680, SHOWCONSOLE);setorigin(320, 240);int a, b;for (int i = 0; i < Max; i++) {a = x[i].a * time;b = x[i].b * time;fillcircle(a, b, 4);}
}
​
void draw_line(int a, int b, int c, int d) {line(a * time, b * time, c * time, d * time);
}

运行结果

先写一个points.txt文件的点(20个)

img

运行:(可视化界面)

这篇关于暴力法解决最近对问题和凸包问题-实现可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977715

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了