Inhaltsverzeichnis
Problemstellung
Beispiel 2
Anleitung
Methode 1: Brute-Force-Cracking
Pseudocode
Beispiel: C++-Implementierung
Ausgabe
Methode 2: Optimierungsmethode
Das Folgende ist die C++-Implementierung,
Fazit
Heim Backend-Entwicklung C++ Überprüft, ob es möglich ist, vom Ursprung aus jeden Punkt auf dem Umfang eines gegebenen Kreises zu erreichen

Überprüft, ob es möglich ist, vom Ursprung aus jeden Punkt auf dem Umfang eines gegebenen Kreises zu erreichen

Aug 29, 2023 pm 09:13 PM
编程 检查 原点 圆周

Überprüft, ob es möglich ist, vom Ursprung aus jeden Punkt auf dem Umfang eines gegebenen Kreises zu erreichen

Der Umfang eines Kreises kann als äußere Grenze des Kreises definiert werden. Es ist der Umfang des Kreises. Jeder Punkt um den Kreis herum folgt bestimmten Eigenschaften, wie unten gezeigt -

  • Punkt (x,y) liegt innerhalb des Kreises, sodass $mathrm{x^2 + y^2

  • gilt
  • Punkt (x,y) liegt auf dem Kreis, so dass $mathrm{x^2 + y^2 = R^2}$

  • Punkt (x,y) liegt außerhalb des Kreises, sodass $mathrm{x^2 + y^2 > R^2}$

  • gilt

Wobei R = Kreisradius.

Problemstellung

Gegeben sei eine Zeichenfolge S, die eine Folge von Bewegungen (L, R, U, D) darstellt, und eine ganze Zahl R, die den Radius eines Kreises darstellt. Prüfen Sie, ob ein beliebiger Punkt auf dem Umfang eines Kreises mit dem Radius R mit dem Ursprung erreicht werden kann, indem Sie eine Teilfolge von Bewegungen ausgehend von S auswählen. Die Funktionsweise jeder Bewegung ist wie folgt:

  • L = x-Koordinate reduzieren

  • R = inkrementelle x-Koordinate

  • U = Y-Koordinateninkrement

  • D = Abnehmende Y-Koordinate

Beispiel 1

Eintreten

S = “RURDLR”
R = 2
Nach dem Login kopieren

Ausgabe

yes
Nach dem Login kopieren
Nach dem Login kopieren

Anleitung

Untersequenz „RR“ auswählen -

Anfangs (0, 0) + R -> (1, 0) + R -> (2, 0).

Umfang kann 22 + 02 = 4 = R2

sein

Beispiel 2

Eintreten

S = “UUUUU”
R = 6
Nach dem Login kopieren

Ausgabe

no
Nach dem Login kopieren
Nach dem Login kopieren

Anleitung

Wählen Sie die größte Teilsequenz „UUUU“ aus –

Anfangs (0, 0) + U -> (0, 1) + U -> (0, 2) + U -> (0, 3) + U -> (0, 4) + U -> (0 , 5).

Es ist unmöglich, den Umfang zu erreichen, weil 02 + 52 = 25 R2

Methode 1: Brute-Force-Cracking

Die Lösung des Problems besteht darin, alle möglichen Teilfolgen der Zeichenfolge S zu finden und dann zu prüfen, ob jede Teilfolge den Kreis erreichen kann. Diese Bedingungen werden überprüft, indem Zähler für x und y verwaltet werden, wobei x bei jedem L dekrementiert und bei jedem R erhöht wird. Ebenso nimmt y mit jedem D ab und mit jedem U zu. Überprüfen Sie dann x2 + y2 = R2, um zu überprüfen, ob der Endpunkt auf dem Umfang liegt.

Pseudocode

procedure subsequence (S, sub, vec):
   if S is empty
      add sub to vec
      return
   end if
   subsequence(S.substring(1), sub + S[0], vec)
   subsequence(S.substring(1), sub, vec)
end procedure

procedure checkSeq (S, R)
   x = 0
   y = 0
   for move in S do
      if move == 'L' then
         x = x - 1
      else if move == 'R' then
         x = x + 1
      else if move == 'U' then
         y = y + 1
      else if move == 'D' then
         y = y - 1
      end if
      if x^2 + y^2 = R^2 then
         return true
      end if
   end for
   return false
end procedure

procedure reachCircumference (S, R):
   v = []      
   subsequence(S, "", v)
   for str in v:
      if checkSeq(str, R)
      return "yes"
      end if
   return "no"
end procedure
Nach dem Login kopieren

Beispiel: C++-Implementierung

Erstellen Sie im folgenden Programm alle möglichen Teilfolgen der Zeichenfolge S und prüfen Sie, ob sie den Umfang des Kreises erreichen.

#include <bits/stdc++.h>
using namespace std;

// Function to create all the possible subsequence of string S
void subsequence(string S, string sub, vector<string> &vec){

   // Base Case
   if (S.empty()) {
      vec.push_back(sub);
      return;
   }
   
   // Subsequence including the character
   subsequence(S.substr(1), sub + S[0], vec);
   
   // Subsequence excluding the character
   subsequence(S.substr(1), sub, vec);
}

// Function to check if a given sequence of steps lead to the circumference of the circle with radius R
bool checkSeq(string S, int R){

   // Initialising centre of circle as (0, 0)
   int x = 0, y = 0;
   for (char move : S) {
      if (move == 'L') {
         x -= 1;
      } else if (move == 'R') {
         x += 1;
      } else if (move == 'U') {
         y += 1;
      } else if (move == 'D') {
         y -= 1;
      }
      
      // Check to find if (x, y) lie on circumference using the circle equation
      if (x*x + y*y == R*R) {
         return true;
      }
   }
   return false;
}

// function to check if any subsequence of string S leads to any point on the circumference of the circle
string reachCircumference(string S, int R){
   vector <string> v;
   string sub = "";
   
   // Storing all subsequence in vector v
   subsequence(S, sub, v);
   
   // Checking the condition for each subsequence
   for (auto str: v) {
      if(checkSeq(str, R)) {
         return "yes";
         break;
      }
   }
   return "no";
}

// Driver Code
int main(){
   string S = "RURDLR";
   int R = 2;
   cout << reachCircumference(S, R) << endl;
   return 0;
}
Nach dem Login kopieren

Ausgabe

yes
Nach dem Login kopieren
Nach dem Login kopieren

Methode 2: Optimierungsmethode

Eine effiziente Möglichkeit, dieses Problem zu lösen, besteht darin, mithilfe von (L, R, U oder D) zu überprüfen, ob die Summe der Quadrate von x und y dem Quadrat des Radius für jedes Paar von x und y entspricht.

Zuerst zählen wir die maximale Häufigkeit jedes Schritts und prüfen, ob einer davon gleich R ist. Wenn nicht gleich, prüfen wir, ob eine beliebige Anzahl von Paaren von L oder R und U oder D zu einem Distanzursprung gleich R führen kann.

Pseudocode

procedure reachCircumference (S, R)
   cL = 0
   cR = 0
   cD = 0
   cU = 0
   for move in S do
if move == 'L' then
x = x - 1
else if move == 'R' then
x = x + 1
else if move == 'U' then
y = y + 1
else if move == 'D' then
y = y - 1
end if
if x^2 + y^2 = R^2 then
return true
end if
end for
   if max(max(cL, cR), max(cD, cU)) >= R
      return “yes”
   maxLR = max(cL, cR)
maxUD = max(cU, cD)
Initialise unordered map mp
sq = R * R
for i = 1 till i * i = sq
   if sq - i*i is not in the map
      if maxLR>= mp[sq - i * i] and maxUD >= i
         return “yes”
      end if
      if maxLR >= i && maxUD >= mp[sq - i * i]
         return “yes”
      end if
   end if
end for
return “no”
end procedure
Nach dem Login kopieren

Das Folgende ist die C++-Implementierung,

Im folgenden Programm verwenden wir eine Karte, um zu prüfen, ob es eine Teilfolge gibt, die zum Umfang eines Kreises führt.

#include <bits/stdc++.h>
using namespace std;

// Function to check if any subsequence of string S leads to any point on the circumference of the circle
string reachCircumference (string S, int R){

   // Counting total occurrenceof each L, R, U, D
   int cL = 0, cR = 0, cD = 0, cU = 0;
   for (char move : S) {
      if (move == 'L') {
         cL++;
      } else if (move == 'R') {
         cR++;
      } else if (move == 'U') {
         cU++;
      } else if (move == 'D') {
         cD++;
      }
   }
   
   // Checking for a path to circumference using only one type of move
   if (max(max(cL, cR), max(cD, cU)) >= R) {
      return "yes";
   }
   int maxLR = max(cL, cR), maxUD = max(cU, cD);
   unordered_map<int, int> mp;
   int sq = R * R;
   for (int i = 1; i * i <= sq; i++) {
      mp[i * i] = i;
      if (mp.find(sq - i * i) != mp.end()) {
      
         // Checking if it is possible to reach (± mp[r_square - i*i], ± i)
         if (maxLR>= mp[sq - i * i] && maxUD >= i)
            return "yes";
            
         // Checking if it is possible to reach (±i, ±mp[r_square-i*i])
         if (maxLR >= i && maxUD >= mp[sq - i * i])
            return "yes";
      }
   }
   return "no";
}

// Driver Code
int main(){
   string S = "RURDLR";
   int R = 5;
   cout << reachCircumference(S, R) << endl;
   return 0;
}
Nach dem Login kopieren

Ausgabe

no
Nach dem Login kopieren
Nach dem Login kopieren

Fazit

Zusammenfassend lässt sich sagen, dass Sie eine der oben genannten Methoden verwenden können, um herauszufinden, ob Sie eine Teilfolge von Schritten in der Zeichenfolge S verwenden können, um den Umfang eines Kreises mit Mittelpunkt im Ursprung zu ermitteln. Die zweite Methode ist schneller, benötigt aber zusätzlichen Speicherplatz, während die erste Methode eine Brute-Force-Methode ist, die nicht sehr effizient, aber leicht zu verstehen ist.

Das obige ist der detaillierte Inhalt vonÜberprüft, ob es möglich ist, vom Ursprung aus jeden Punkt auf dem Umfang eines gegebenen Kreises zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus dem PHP-Array Entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus dem PHP-Array Apr 26, 2024 pm 04:33 PM

So entfernen Sie doppelte Werte mithilfe regulärer Ausdrücke aus einem PHP-Array: Verwenden Sie den regulären Ausdruck /(.*)(.+)/i, um Duplikate abzugleichen und zu ersetzen. Durchlaufen Sie die Array-Elemente und prüfen Sie mit preg_match, ob Übereinstimmungen vorliegen. Wenn es eine Übereinstimmung gibt, überspringen Sie den Wert; andernfalls fügen Sie ihn einem neuen Array ohne doppelte Werte hinzu.

Wozu dient das Programmieren und welchen Nutzen hat es, es zu lernen? Wozu dient das Programmieren und welchen Nutzen hat es, es zu lernen? Apr 28, 2024 pm 01:34 PM

1. Mithilfe der Programmierung können verschiedene Software- und Anwendungsprogramme entwickelt werden, darunter Websites, mobile Anwendungen, Spiele und Datenanalysetools. Seine Anwendungsbereiche sind sehr breit gefächert und decken nahezu alle Branchen ab, darunter wissenschaftliche Forschung, Gesundheitswesen, Finanzen, Bildung, Unterhaltung usw. 2. Das Erlernen des Programmierens kann uns helfen, unsere Fähigkeiten zur Problemlösung und unser logisches Denkvermögen zu verbessern. Beim Programmieren müssen wir Probleme analysieren und verstehen, Lösungen finden und diese in Code übersetzen. Diese Denkweise kann unsere analytischen und abstrakten Fähigkeiten fördern und unsere Fähigkeit verbessern, praktische Probleme zu lösen.

Erstellen Sie browserbasierte Anwendungen mit Golang Erstellen Sie browserbasierte Anwendungen mit Golang Apr 08, 2024 am 09:24 AM

Erstellen Sie browserbasierte Anwendungen mit Golang. Golang kombiniert mit JavaScript, um dynamische Front-End-Erlebnisse zu erstellen. Installieren Sie Golang: Besuchen Sie https://golang.org/doc/install. Richten Sie ein Golang-Projekt ein: Erstellen Sie eine Datei mit dem Namen main.go. Verwendung von GorillaWebToolkit: Fügen Sie GorillaWebToolkit-Code hinzu, um HTTP-Anfragen zu verarbeiten. HTML-Vorlage erstellen: Erstellen Sie index.html im Unterverzeichnis „templates“, bei dem es sich um die Hauptvorlage handelt.

Sammlung von C++-Programmierrätseln: Regen Sie das Denken an und verbessern Sie Ihre Programmierkenntnisse Sammlung von C++-Programmierrätseln: Regen Sie das Denken an und verbessern Sie Ihre Programmierkenntnisse Jun 01, 2024 pm 10:26 PM

C++-Programmierrätsel behandeln Algorithmen- und Datenstrukturkonzepte wie Fibonacci-Folge, Fakultät, Hamming-Distanz, Maximal- und Minimalwerte von Arrays usw. Durch das Lösen dieser Rätsel können Sie Ihre C++-Kenntnisse festigen und das Algorithmusverständnis und die Programmierkenntnisse verbessern.

Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Problemlösung mit Python: Erschließen Sie leistungsstarke Lösungen als Programmieranfänger Oct 11, 2024 pm 08:58 PM

Python unterstützt Anfänger bei der Problemlösung. Seine benutzerfreundliche Syntax, umfangreiche Bibliothek und Funktionen wie Variablen, bedingte Anweisungen und Schleifen ermöglichen eine effiziente Codeentwicklung. Von der Datenverwaltung über die Steuerung des Programmablaufs bis hin zur Ausführung wiederkehrender Aufgaben bietet Python

Holen Sie sich Go-Module schnell und einfach mit Go Get Holen Sie sich Go-Module schnell und einfach mit Go Get Apr 07, 2024 pm 09:48 PM

Über GoGet können Sie Go-Module schnell und einfach abrufen. Die Schritte sind wie folgt: Führen Sie im Terminal aus: goget[Modulpfad], wobei Modulpfad der Modulpfad ist. GoGet lädt das Modul und seine Abhängigkeiten automatisch herunter. Der Speicherort der Installation wird durch die Umgebungsvariable GOPATH angegeben.

Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Der Schlüssel zum Programmieren: Die Leistungsfähigkeit von Python für Anfänger freischalten Oct 11, 2024 pm 12:17 PM

Python ist aufgrund seiner einfachen Erlernbarkeit und leistungsstarken Funktionen eine ideale Einführungssprache in die Programmierung für Anfänger. Zu seinen Grundlagen gehören: Variablen: werden zum Speichern von Daten (Zahlen, Zeichenfolgen, Listen usw.) verwendet. Datentyp: Definiert den Datentyp in der Variablen (Ganzzahl, Gleitkomma usw.). Operatoren: werden für mathematische Operationen und Vergleiche verwendet. Kontrollfluss: Kontrollieren Sie den Fluss der Codeausführung (bedingte Anweisungen, Schleifen).

Verwenden Sie zur Fehlerbehandlung den Fehlerumbruch- und -abwicklungsmechanismus von Golang Verwenden Sie zur Fehlerbehandlung den Fehlerumbruch- und -abwicklungsmechanismus von Golang Apr 25, 2024 am 08:15 AM

Die Fehlerbehandlung in Go umfasst das Ein- und Auspacken von Fehlern. Durch das Umschließen von Fehlern kann ein Fehlertyp mit einem anderen umschlossen werden, wodurch ein umfassenderer Kontext für den Fehler bereitgestellt wird. Erweitern Sie Fehler und durchlaufen Sie die verschachtelte Fehlerkette, um den Fehler auf der niedrigsten Ebene zu finden und das Debuggen zu vereinfachen. Durch die Kombination dieser beiden Techniken können Fehlerbedingungen effektiv behandelt werden, wodurch ein umfassenderer Fehlerkontext und bessere Debugging-Funktionen bereitgestellt werden.

See all articles