Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ . में उत्तल बहुभुज


मान लीजिए कि हमारे पास उन बिंदुओं की एक सूची है जो क्रमिक रूप से जुड़ने पर बहुभुज बनाते हैं, हमें यह पता लगाना होगा कि क्या यह बहुभुज उत्तल है (उत्तल बहुभुज परिभाषा)। हमें यह ध्यान रखना होगा कि कम से कम 3 और अधिक से अधिक 10,000 अंक हों। और निर्देशांक -10,000 से 10,000 की सीमा में हैं।

हम मान सकते हैं कि दिए गए बिंदुओं से बना बहुभुज हमेशा एक साधारण बहुभुज होता है, दूसरे शब्दों में, हम यह सुनिश्चित करते हैं कि बिल्कुल दो किनारे प्रत्येक शीर्ष पर प्रतिच्छेद करते हैं और किनारे अन्यथा एक दूसरे को नहीं काटते हैं। तो अगर इनपुट इस तरह है:[[0,0], [0,1], [1,1], [1,0]], तो यह उत्तल है, इसलिए लौटाया गया मान सत्य होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक विधि कैल्क () को परिभाषित करें, यह कुल्हाड़ी, ay, bx, by, cx, cy लेगा, यह निम्नानुसार काम करेगा -

  • BAx:=ax – bx, BAy:=ay – by, BCx:=cx – bx, BCy:=cy – by

  • मुख्य विधि से निम्न कार्य करें

  • नकारात्मक:=झूठा और स्थिति:=झूठा, एन:=अंक सरणी का आकार

  • मेरे लिए 0 से n - 1 की सीमा में

    • ए:=आई, बी:=(i + 1) मॉड एन और सी:=(i + 2) मॉड एन

    • cross_prod :=कैल्क(p[a, 0], p[a, 1], p[b, 0], p[b, 1], p[c, 0], p[c, 1])

    • अगर cross_prod <0, तो neg :=true, अन्यथा जब cross_prod> 0, तब pos :=true

    • अगर नकारात्मक और स्थिति सही है, तो झूठी वापसी करें

  • सही लौटें

उदाहरण (C++)

एक बेहतर समझ प्राप्त करने के लिए आइए निम्नलिखित कार्यान्वयन को देखें -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool isConvex(vector<vector<int>>& points) {
      bool neg = false;
      bool pos = false;
      int n = points.size();
      for(int i = 0; i < n; i++){
         int a = i;
         int b = (i + 1) % n;
         int c = (i + 2) % n;
         int crossProduct = calc(points[a][0], points[a][1], points[b][0], points[b][1], points[c][0], points[c][1]);
         if(crossProduct < 0) neg = true;
         else if(crossProduct > 0) pos = true;
         if(neg && pos) return false;
      }
      return true;
   }
   int calc(int ax, int ay, int bx, int by, int cx, int cy){
      int BAx = ax - bx;
      int BAy = ay - by;
      int BCx = cx - bx;
      int BCy = cy - by;
      return (BAx * BCy - BAy * BCx);
   }
};
main(){
   vector<vector<int>> v = {{0,0},{0,1},{1,1},{1,0}};
   Solution ob;
   cout << (ob.isConvex(v));
}

इनपुट

[[0,0],[0,1],[1,1],[1,0]]

आउटपुट

1

  1. C++ . में विकर्ण ट्रैवर्स II

    मान लीजिए कि हमारे पास nums नामक सूचियों की एक सूची है, हमें अंकों के सभी तत्वों को विकर्ण क्रम में दिखाना होगा। तो, अगर इनपुट पसंद है तो आउटपुट [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16] होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - एक सरणी रिट परिभाषित करें एक 2डी सरणी को परिभाषित

  1. सी ++ में प्रक्रिया को मारें

    मान लीजिए कि हमारे पास n प्रक्रियाएं हैं, यहां प्रत्येक प्रक्रिया की एक विशिष्ट आईडी होती है जिसे PID या प्रक्रिया आईडी कहा जाता है और उसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रक्रिया में केवल एक पैरेंट प्रक्रिया होती है, लेकिन इसमें एक या अधिक चाइल्ड प्रक्रियाएं हो सकती हैं। यह एक प

  1. सी ++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट हैं। स्थितियों को 2डी ग्रिड में कोशिकाओं द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नटों को इकट्ठा करने और उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी का पता लगाना है। गिलहरी एक समय में केवल एक अखरोट ले सकती है और चार दिशाओं में - ऊपर, नीचे, बाएँ औ