domingo, 29 de abril de 2012

Problema para la primer semana de mayo

Cambiando un poco el rumbo, propongo ahora que trabajemos con el problema Minas de la OMI Trainingate. Comenten todas sus ideas, avances o cualquier otro comentario.


Buscaminas Reloaded

Karelov III 2007
Tiempo: 1 segundo
Seguramente ya conoces el juego de buscaminas, en el cual tu empiezas con una cuadricula cubierta de cuadrados sin idea de qué hay en ellos. Seleccionando un cuadrado revela que hay en él(puede ser una mina o un espacio vacio).
Si encuentras un cuadro con un espacio vacío un número es impreso dentro de ese cuadro diciéndote cuántas minas son adyacentes a ese espacio vacío.
Un buen día te topaste con un juego de buscaminas con unicamente 2 filas y con N columnas.
Decidiste aventurarte un poco y seleccionaste todos los cuadrados de una de las filas, y como estabas de suerte, ninguno de los cuadrados de la fila resultó tener minas.
Sin embargo, en dicha fila aparecieron muchos números indicando cuántas minas había adyacentes a cada cuadro(todas las minas resultaron estar en la otra fila).

Problema

Dados los números que aparecieron en la fila que seleccionaste, determina en qué lugares de la otra fila debe haber minas.

Entrada

La primera línea contendrá un número entero 1≤N≤200, la segunda línea contendrá unicamente N dígitos(números del 1 al 9) sin espacios representando el contenido de los cuadrados de la fila que seleccionaste.

Salida

Deberá contener una sola línea con N caracteres, cada caracter deberá ser un '.' si no hay mina en su posición correspondiente o un '*' si la hay. Se garantiza que siempre habrá una y solo una solución posible.

Ejemplo


Entrada
6
112110
Salida
.*.*..

Consideraciones

Se garantiza que siempre habrá solamente una solución posible, además 1≤N≤200.




3 comentarios:

  1. El problema me parece bastante sencillo.
    Aunque olvide como leer caracteres, esta es la idea(ayudenme a corregirla):

    #include
    long a[202],i,n,b[2002];
    chair c[200];

    int main(){
    scanf("%ld",&n);

    for(i=0;i<n;i++){
    scanf("%chair",c[i]);
    b[i+1]=c[i];
    }

    if(b[3]<b[2])
    a[1]=1;

    for(i=1;i<n;i++)
    a[i+1]=b[i]-a[i-1]-a[i];

    for(i=1;i<n+1;i++){
    if(a[i]==0){
    printf("*");
    }else{
    printf(".");
    }

    }

    }

    ResponderEliminar
    Respuestas
    1. siguiendo con la idea


      #include
      #include


      int a[204],i,n,b[204],j;


      int main(){
      scanf("%ld",&n);

      for(i=0;i<n;i++){
      scanf("%d",&j);
      b[i]=j;
      }


      if(b[1]<b[0])
      a[0]=1;

      for(i=1;i<n;i++)
      a[i+1]=b[i]-a[i]-a[i+2];


      for(i=1;i<n+1;i++){
      if(a[i]==0){
      printf("*");
      }else{
      printf(".");
      }

      }

      }

      Eliminar
    2. No era tan simple, casitos:

      #include
      long a[202],i,n,e;
      char c[200];

      int main(){
      scanf("%ld",&n);

      scanf("%s",c);

      for(i=0;i<n;i++){
      c[i]=c[i]-'0';
      }

      a[0]=1;
      a[1]=c[0]-1;

      for(i=2;i<n+1;i++)
      a[i]=c[i-1]-a[i-1]-a[i-2];

      for(i=0;i<n;i++){
      if(a[i]==-1||a[i]==2){
      e=1;
      break;
      }
      }

      if(a[n]==0&&e==0){
      for(i=0;i<n;i++){
      if(a[i]==1){
      printf("*");
      }else{
      printf(".");
      }
      }
      }else{
      a[0]=0;
      a[1]=c[0];

      for(i=2;i<n;i++)
      a[i]=c[i-1]-a[i-1]-a[i-2];

      for(i=0;i<n;i++){
      if(a[i]==1){
      printf("*");
      }else{
      printf(".");
      }
      }
      }


      }

      Eliminar