軟件工程畢業(yè)可以做網(wǎng)站嗎購買網(wǎng)站域名
目錄
最近對問題
凸包問題
最近對問題
顧名思義就是采用蠻力法求出所有點之間的距離,然后進行比較找出第一個最近對,一個一個進行比較。
大概思路就是如圖(每個圈代表一個數(shù)對)
第一個和其他四個比較
第二個和其他三個比較
.......
最后比較最小的
代碼
圖形化界面主要是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 << "存儲的數(shù)據(jù)如下:" << 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個)
運行(可視化界面)
凸包問題
凸包問題就是在一個有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 // 最大點數(shù)
#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 << "存儲的數(shù)據(jù)如下:" << 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個)
運行:(可視化界面)