Java - Calcular desplazamiento de un robot

 
Vista:

Calcular desplazamiento de un robot

Publicado por Alejo (2 intervenciones) el 24/08/2022 00:14:18
Un robot se desplaza horizontalmente por el eje X. Recibe las instrucciones de movimiento en un string, que contiene "I" para moverse una posición a la izquierda y "D" para moverse una posición a la derecha. Parte de una posición dada. Mostrar cuántos puntos diferentes visita el robot cuando se ejecutaron todos los comandos. Un punto se considera visitado si coincide con la posición del robot antes o después de ejecutar algún comando.

formato de input

Lee la secuencia de comandos y luego la posición inicial.



La secuencia tiene como máximo 100 comandos y como mínimo 1 comando. Los comandos son "I" o "D". La posición inicial es un entero entre -10000 y 10000, ambos inclusive. Asumir datos válidos.

formato de output

Imprimir la cantidad de puntos diferentes alcanzados.

Ejemplo de input

II
0

Lo que deberia mostrar

3



Esto es lo que hice, pero claramente esta mal dado que no encuentro la forma de que cuando el robot pase por una posicion "ya conocida" no sume a la cantidad de posiciones recorridas.
Gracias!

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
public static void main(String args[] ) throws Exception {
String desplazamiento;
Scanner in= new Scanner (System.in);
desplazamiento = in.nextLine();
int cantpos;
int cantD=0;
int cantI=0;
int posicion;
for (int i=0;i<desplazamiento.length();i++){
if(desplazamiento.charAt(i)=='D'){
cantD+=1;

}
if(desplazamiento.charAt(i)=='I'){
cantI-=1;
}
}
posicion =(cantD+cantI);

cantpos=desplazamiento.length()-Math.abs(posicion);
System.out.println(cantpos);
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular desplazamiento de un robot

Publicado por Kabuto (1381 intervenciones) el 24/08/2022 00:47:04
Supongamos que partimos de la posición 0.
1
int posicion = 0;
Movernos a la izquierda nos hace ir por los puntos -1, -2, -3,...
Movernos a la derecha nos hacer ir por los puntos 1, 2, 3, ...

Bien, creo que lo que puede funcionar es usar dos variables para guardar cuál es la máxima posición que se ha podido alcanzar hacia un lado y al otro.

En cada cambio de posición, comprobamos si hemos superado el máximo visitado por la izq (recordando que son negativos) o bien por la derecha.
Si hemos superado ese máximo, actualizamos la variable correspondiente con la nueva posición.

De esta manera, en esas variables tendremos los desplazamientos que hemos logrado alcanzar por ambos lados, respecto a la posición inicial de 0.

Por ejemplo, la secuencia "iid" hará estos cambios en el valor de posición
1
2
3
posicion = -1
posicion = -2
posicion = -1
El máximo por la izquierda (los negativos) será -2 y el máximo por la derecha será 0, ya que esa última "d" no es suficiente para alcanzar de nuevo la posición 0 o superarla

Pues bien, para saber el total de posiciones visitadas, sumamos esos dos valores, quitando el negativo a los valores de la izquierda.
Así que sumamos 2 + 0 + 1 = 3

El +1 porque la posición inicial 0 también cuenta como una posición visitada, así que se han visitado 3 posiciones, que son 0, -1 y -2

El código podría ser así.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MueveRobot {
 
	public static void main(String[] args) {
 
		Scanner teclado = new Scanner(System.in);
		int posicion = 0, maxIzq = 0, maxDer = 0;
 
		System.out.print("Secuencia: ");
		String secuencia = teclado.nextLine();
		teclado.close();
 
		//Analizamos secuencia
		for (int i = 0; i < secuencia.length(); i++) {
			if (secuencia.charAt(i) == 'i') {
				posicion--;
				if (posicion < maxIzq) //Comprobamos si hemos visitado nuevas posiciones por la izq
					maxIzq = posicion;
			}
			else { //Es derecha
				posicion++;
				if (posicion > maxDer) //Comprobamos si hemos visitado nuevas posiciones por la der
					maxDer = posicion;
			}
		}
		//Secuencia completada, a ver cuantas posiciones hemos visitado
		int posiciones = maxDer + Math.abs(maxIzq) + 1;//+1 porque la posicion inicial 0 tambien se cuenta
 
		System.out.println("Posiciones visitadas: " + posiciones);
	}
 
}

Si ejecutamos, parece que da resultados correctos:
1
2
Secuencia: iid
Posiciones visitadas: 3

1
2
Secuencia: iiddd
Posiciones visitadas: 4

1
2
Secuencia: ididididididididididididididid
Posiciones visitadas: 2

1
2
Secuencia: iiddddiiddddiiidddddiiiiiiiiiiddd
Posiciones visitadas: 11

No he tenido en cuenta lo de imponer los límites de 10000 y -10000, es lo que faltaría añadir.
Comenta si algo no se entiende o piensas que no es correcto.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular desplazamiento de un robot

Publicado por Alejo (2 intervenciones) el 24/08/2022 01:11:09
Perfecto!! Te agradesco un monton!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar