Vérifier S'il existe un Cercle
M'a demandé lors d'un Google Entrevue.
Nous nous sommes donné une chaîne de caractères composée de lettres - F,L,R. - qui est l'instruction d'un robot suit
F - va de l'avant par une seule étape.
L-tourner à gauche.
R - tourner à droite.
La longueur de la chaîne peut être jusqu'à 2500 caractères.
La chaîne va lui-même un nombre infini de fois. Nous avons besoin de savoir si il existe un cercle avec un rayon r( r peut être n'importe quel nombre réel), de telle sorte que le robot ne quitte jamais le cercle.
J'ai été coincé à ce point.J'ai pensé à l'aide de l'enveloppe convexe, mais comment le vérifier pour un nombre infini de fois.Explication avec le code sera appréciée. S'il vous plaît aider. Merci d'avance
- Enquêter sur le sujet des marches aléatoires sur les grilles.
- Mauvaise question ou pas, les gens ont pris le temps de répondre. Vous pouvez demander un nouveau si vous voulez, mais s'il vous plaît ne pas le supprimer.
Vous devez vous connecter pour publier un commentaire.
Le nombre de directions est de 4. Ainsi, après l'exécution de la simulation 4 fois il regarde dans la même direction comme il l'a fait dans un premier temps(chaque frotter tourne par le même angle).
C'est pourquoi 4 séries consécutives juste passer par un vecteur, sans aucune rotation.
Ainsi, il nous suffit de lancer la simulation 4 fois de suite et voir si il s'est arrêté dans le point d'origine. Si il l'a fait, on peut trouver le minimum de cercle qui contient son chemin. Sinon, pas de ce cercle existe.
Vous devez exécuter 1 itération pour calculer la nouvelle position, dire newx, newy.
Ensuite, vous calculez les 4 plus d'itérations pour voir si le robot est de retour à newx-newy. Si oui, alors le cercle existe, d'autre pas.
Le rayon de la distance maximale que le robot s'aventura dans son itération.
Mise en œuvre du Code -
F
, etL
ne pas faire le déplacement, si dans votreswitch
blocs pour ces commandes nedir
doit être changé. Toutefois, cette imprécision ne permet pas de modifier l'ensemble de l'algorithmeExécution de la chaîne, de voir où le robot est à sa fin et la direction dans laquelle il regarde.
Si il est de retour à l'origine, prendre de la distance maximale à partir de l'origine, il avait au cours de l'exécution et de la comparer à la r.
Si elle n'est pas de retour à l'origine, vérifier son orientation:
Si il a la même orientation qu'il avait au début, puis il s'éloigne de l'origine indéfiniment, donc pas de cette r existe.
Si il a un autre sens que celui qu'elle avait au début, puis il sera de retour à l'origine après 4 ou 2 itérations de la chaîne, selon qu'il est orienté vers la gauche/droite de son orientation d'origine, ou à l'inverse de cela, respectivement. Maintenant, prenez la distance maximale qu'il avait au bout de 2 exécutions de la chaîne. (Cas Simple distinctions montrera qu'il aura visité sa distance maximale au bout de 2 exécutions, peu importe si la période est de 2 ou 4 exécutions.)
}
F
, pasG
.Cela peut fonctionner:
Parcourir la chaîne donnée en une fois et notez le déplacement et la direction dans laquelle vous vous retrouvez. Si le déplacement est non-nul, et le début et la fin directions sont les mêmes pour le robot pour la seule itération, votre robot ne peut pas être contenue dans un cercle, sinon, il peut être.
Figure:
Dans l'illustration, supposons que le robot va d'Un point a à un point B, après une seule itération de la chaîne. Maintenant, l'angle ABC est (90 - thêta), qui fait l'angle ABD égale à 90 degrés. Avec tous les côtés de l'égalité, et à chaque angle égal à 90 degrés, le quadrilatère ABDE est un carré. Cela est vrai pour toute valeur de theta (aigu ou obtus). La preuve serait similaire si la fin de la direction, après une seule itération est à gauche. Pour le sud, le robot va osciller entre les points A et B.
Donc comme une solution à votre problème, vous avez juste à vérifier si le début et la fin de la direction sont les mêmes et que le point de départ et la position d'arrivée ne sont pas les mêmes, après que le robot effectue une itération de la chaîne.