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

45度の線で、C++で平面を2つの等しい重みの部分に分割できるかどうかを確認します


2D座標にn個の異なるポイント(Xi、Yi)があり、各ポイントの重みがWiであるとすると、45度の線を描画できるかどうかを確認する必要があります。両側のポイントの重みの合計が同じになるようにします。

したがって、入力が[[-1,1,3]、[-2,1,1]、[1、-1,4]]の場合、出力はTrue /

になります。

これを解決するには、次の手順に従います-

  • n:=vのサイズ
  • 1つのマップweight_at_xを定義します
  • max_x:=-2000、min_x:=2000
  • iを初期化する場合:=0、i
  • temp_x:=v [0、i]-v [1、i]
  • max_x:=max_xとtemp_xの最大値
  • min_x:=min_xとtemp_xの最小値
  • weight_at_x [temp_x]:=weight_at_x [temp_x] + v [2、i]
  • 配列sum_tempを定義します
  • sum_tempの最後に0を挿入
  • xを初期化する場合:=min_x、x <=max_xの場合、更新(xを1つ増やす)、実行-
    • sum_tempの最後に(sum_temp + weight_at_x [x]の最後の要素)を挿入します
  • total_sum:=sum_tempの最後の要素
  • partition_possible:=false
  • iを初期化する場合:=1、i
  • sum_temp[i]がtotal_sum--sum_temp[i]と同じ場合、-
    • partition_possible:=true
  • sum_temp[i-1]がtotal_sum--sum_temp[i]と同じ場合、-
    • partition_possible:=true
  • return partition_possible
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    void is_valid_part(vector<vector<int>> &v){
       int n = v.size();
       map<int, int> weight_at_x;
       int max_x = -2000, min_x = 2000;
       for (int i = 0; i < n; i++) {
          int temp_x = v[0][i] - v[1][i];
          max_x = max(max_x, temp_x);
          min_x = min(min_x, temp_x);
          weight_at_x[temp_x] += v[2][i];
       }
       vector<int> sum_temp;
       sum_temp.push_back(0);
       for (int x = min_x; x <= max_x; x++) {
          sum_temp.push_back(sum_temp.back() + weight_at_x[x]);
       }
       int total_sum = sum_temp.back();
       int partition_possible = false;
       for (int i = 1; i < sum_temp.size(); i++) {
          if (sum_temp[i] == total_sum - sum_temp[i])
             partition_possible = true;
          if (sum_temp[i - 1] == total_sum - sum_temp[i])
             partition_possible = true;
       }
       printf(partition_possible ? "TRUE" : "FALSE");
    }
    int main() {
       vector<vector<int>> v = {{-1,1,3},{-2,1,1},{1,-1,4}};
       is_valid_part(v);
    }

    入力

    {{-1,1,3},{-2,1,1},{1,-1,4}}

    出力

    TRUE

    1. C++で線が円に接触または交差するかどうかを確認します

      円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$

    2. 線がC++の原点を通過するかどうかを確認します

      このセクションでは、線分が原点を通過しているかどうかを確認する方法を説明します。線分の端点を表す2つの座標点があります。 アプローチは簡単です。直線の方程式を作成でき、方程式に(0、0)を入れて方程式が満たされる場合、直線は原点を通過します。 点がであると仮定すると、直線の方程式はこれらの2つの直線を通過します- $$ y-y_ {1} =\ left(\ frac {y_ {2} -y_ {1}} {x_ {2}-x_ {1}} \ right)* \ lgroup x-x_ {1} \ rgroup + c $$ x=0およびy=0とすると、次のようになります $$ x_ {1