Advertisement
AntonioVillanueva

Movimiento de un robot en un plano

Apr 7th, 2020
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.30 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: latin-1 -*-
  3. import math
  4.  
  5. def posicion_objeto(mapa,w,h,objeto='O'):
  6.     """ busca O por defecto pero puede buscar otras cosas"""   
  7.     for y in range(h):
  8.         for x in range(w):
  9.             if mapa[y][x]==objeto:
  10.                 return (y,x)
  11.                                    
  12. def que_hay(mapa,w,h,yy,xx):
  13.     """ mira que hay en este posible movimiento True no hay obstaculos"""
  14.     for y in range(h)
  15.         for x in range(w):
  16.             """ que hay en esta posicion """
  17.             if x==xx and y==yy:
  18.                 if mapa[y][x]=='.' or mapa[y][x]=='O':
  19.                     return True #puede avanzar . 0
  20.                    
  21.                 return False #hay un obstaculo #
  22.                        
  23. def robot (mapa,w,h,n):
  24.     """ movimiento del robot dentro del mapa"""
  25.    
  26.     #Los movimientos pueden ser repetitidos una secuencia
  27.     repeticion=[]
  28.     #cuanto dura una secuencia , un periodo de repeticion?
  29.     secuencia=0
  30.    
  31.     #Recupera la posicion inicial del robot 0
  32.     pos=posicion_objeto(mapa,w,h) #pos (y,x)
  33.    
  34.     #movimiento inicial hacia arriba Up
  35.     move='U'
  36.        
  37.     #el robot se mueve mientra existan n
  38.     while (n):
  39.        
  40.         #Mueve hacia arriba U
  41.         if move=='U' :
  42.            
  43.             #Sube no hay obstaculos
  44.             if que_hay(mapa,w,h,pos[0]-1,pos[1]):
  45.                 pos=pos[0]-1,pos[1]
  46.                
  47.             # ha encontrado un obstaculo gira a la derecha 1 posicion  
  48.             else:
  49.                 pos=pos[0],pos[1]+1
  50.                 move='R' # GIRA HACIA LA DERECHA Right
  51.                                
  52.         #Mueve hacia derecha R
  53.         elif move=='R' :
  54.                        
  55.             #Continua hacia la derecha Right no hay obstaculos
  56.             if que_hay(mapa,w,h,pos[0],pos[1]+1):
  57.                 pos=pos[0],pos[1]+1
  58.                
  59.             # ha encontrado un obstaculo gira a la derecha 1 posicion  
  60.             else:
  61.                 pos=pos[0]+1,pos[1]
  62.                 move='D'# GIRA HACIA ABAJO Down
  63.                
  64.         #Mueve hacia abajo D
  65.         elif move=='D' :
  66.                        
  67.             #Continua hacia abajo D no hay obstaculos
  68.             if que_hay(mapa,w,h,pos[0]+1,pos[1]):
  69.                 pos=pos[0]+1,pos[1]
  70.                
  71.             # ha encontrado un obstaculo gira a la iquierda 1 posicion 
  72.             else:
  73.                 pos=pos[0],pos[1]-1
  74.                 move='L' # GIRA HACIA LA IZQUIERDA Left    
  75.                
  76.         #Mueve hacia izquierda L
  77.         elif move=='L' :
  78.                        
  79.             #Continua izquiera Left no hay obstaculos
  80.             if que_hay(mapa,w,h,pos[0],pos[1]-1):
  81.                 pos=pos[0],pos[1]-1
  82.                
  83.             # ha encontrado un obstaculo gira a la derecha 1 posicion  
  84.             else:
  85.                 pos=pos[0]-1,pos[1]
  86.                 move='U' # GIRA HACIA ARRIBA Up    
  87.        
  88.         #La secuencia se repite ?
  89.         if ((move,pos[1],pos[0]) in repeticion):
  90.             #Si es una secuencia repetitiva puedo simplificarla
  91.             if n>secuencia:
  92.                 n= (n-((n//secuencia)*secuencia))
  93.                 repeticion.clear()         
  94.         else:
  95.             repeticion.append( (move,pos[1],pos[0]) )#guarda direccion y coordenadas
  96.             secuencia+=1
  97.                                                    
  98.         n-=1 #decrementa un movimiento
  99.    
  100.     #ha llegado al final de n donde esta ?
  101.     print (str(pos[1])+' '+str(pos[0]))
  102.  
  103.  
  104. """  w h ancho y alto del mapa"""
  105. w, h = [int(i) for i in input().split()]
  106.  
  107. """ numero de operaciones del robot"""
  108. n = int(input())
  109.  
  110. """ mapa donde se mueve el robot """
  111. mapa=[]
  112.  
  113. """ El mapa donde se mueve el robot. representando
  114. espacio libre. # obstáculo  O la posición inicial"""
  115.  
  116. #anade lineas Y al mapa , cada linea mide X=W
  117. for i in range(h):
  118.     line = input()
  119.     mapa.append(line)
  120.    
  121. #Analisis movimientos del robot
  122. robot (mapa,w,h,n)
  123.  
  124.    
  125. """
  126. Objectif
  127. Desde hace varios años, en las escuelas primarias,
  128. hemos visto la aparición de un nuevo modelo educativo, la programación lúdica.
  129. Los estudiantes deben programar un pequeño robot usando bloques de ensamblaje.
  130. Esto les permite familiarizarse con la programación desde una edad temprana mientras ejercen su lógica y percepción del espacio.
  131.  
  132. Eres un estudiante en una de esas escuelas.
  133. El propósito del ejercicio es simple: su maestro ha creado un circuito para su robot,
  134. le dijo cuántos movimientos puede hacer el robot y debe averiguar la posición final del robot al final de la ejecución.
  135.  
  136. Para hacer esto, necesita conocer algunos principios del funcionamiento del robot.
  137. - Cuando el robot encuentra un obstáculo (representado por #)
  138. gira a la derecha (en la misma operación).
  139. De lo contrario, en un área vacía (representada por.) Se mueve hacia adelante.
  140.  
  141. - El robot inicialmente se mueve hacia arriba.
  142. - El robot se detiene después de n movimientos.
  143. - La esquina superior izquierda representa las coordenadas (0,0)
  144. - El entorno del robot se representa de la siguiente manera, donde O es la posición inicial del robot:
  145. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement