C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で特定のポイントセットの単純な閉じたパスを検索します


一連のポイントがあると考えてください。すべてのポイントをカバーする単純な閉じたパスを見つける必要があります。ポイントが以下のようであり、次の画像がそれらのポイント上で閉じたパスを作成していると仮定します。

C++で特定のポイントセットの単純な閉じたパスを検索します

パスを取得するには、次の手順に従う必要があります-

  • 左下の点をP

    として見つけます
  • Pを中心に反時計回りに極角に基づいて他のn– 1点を並べ替えます。2点の極角が同じである場合は、距離が最短になるように配置します。

  • ソートされたポイントのリストをトラバースし、パスを作成します

#include <bits/stdc++.h>
using namespace std;
class Point {
   public:
   int x, y;
};
Point p0;
int euclid_dist(Point p1, Point p2) {
   return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
}
int orientation(Point p1, Point p2, Point p3) {
   int val = (p2.y - p1.y) * (p3.x - p2.x) - (p2.x - p1.x) * (p3.y - p2.y);
   if (val == 0) return 0; // colinear
   return (val > 0)? 1: 2; // clockwise or counterclock wise
}
int compare(const void *vp1, const void *vp2) {
   Point *p1 = (Point *)vp1;
   Point *p2 = (Point *)vp2;
   int o = orientation(p0, *p1, *p2);
   if (o == 0)
   return (euclid_dist(p0, *p2) >= euclid_dist(p0, *p1))? -1 : 1;
   return (o == 2)? -1: 1;
}
void findClosedPath(Point points[], int n) {
   int y_min = points[0].y, min = 0;
   for (int i = 1; i < n; i++) {
      int y = points[i].y;
      if ((y < y_min) || (y_min == y && points[i].x < points[min].x))
      y_min = points[i].y, min = i;
   }
   swap(points[0], points[min]);
   p0 = points[0];
   qsort(&points[1], n-1, sizeof(Point), compare); //sort on polar angle
   for (int i=0; i<n; i++)
   cout << "(" << points[i].x << ", "<< points[i].y <<"), ";
}
int main() {
   Point points[] = {{0, 3}, {1, 1}, {2, 2}, {4, 4},{0, 0}, {1, 2}, {3, 1}, {3, 3}};
   int n = sizeof(points)/sizeof(points[0]);
   findClosedPath(points, n);
}

出力

(0, 0), (3, 1), (1, 1), (2, 2), (3, 3), (4, 4), (1, 2), (0, 3),

  1. C ++を使用して、指定されたポイントから可能な四辺形の数を見つけます

    四辺形は、ユークリッド平面幾何学で4つの頂点と4つのエッジを持つポリゴンを形成します。名前4-gonなど。四辺形の他の名前に含まれ、正方形、表示スタイルなどとしても知られています。 この記事では、与えられた点から可能な四辺形の数を見つけるためのアプローチを説明します。この問題では、デカルト平面に提供された4つの点(x、y)を使用して作成できる四辺形の数を調べる必要があります。だからここに与えられた問題の例があります- Input : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) Output : 1 Explanation : One quadr

  2. 無向グラフにC++で指定されたサイズの独立集合が含まれているかどうかを確認します

    コンセプト 与えられた無向グラフに関して、サイズlの独立集合が含まれているかどうかを確認します。サイズlの独立集合が存在する場合は「はい」と印刷し、そうでない場合は「いいえ」と印刷します。グラフの独立集合は、互いに直接接続されていない頂点の集合として定義されることに注意してください。 入力 L = 4, graph = [[1, 0, 1, 0, 0], [0, 1, 1, 0, 0],[1, 1, 1, 1, 1], [0, 0, 1, 1, 0],[0, 0, 1, 0, 1]]; 出力 Yes 上のグラフには、サイズ4の独立したセットが含まれています(頂点0、1、3、4は互いに