Solução Pulo do Sapo

Solução por Rogério Júnior

Se o sapo começa na pedra P, e pula sempre uma distância D, então ele pode alcançar qualquer pedra X tal que o resto da divisão de X por D seja P ou congruente a ele (X \equiv P\mod \ D). Deste modo, para cada sala, marcaremos todas as pedras com essa congruência módulo D. Para isso, começaremos da primeira pedra que satisfaça a condição, a marcaremos, e pularemos D pedras para marcar a segundo, outras D para marcar a terceira e assim, de D em D pedras, marcaremos todas as pedras que tal sapo pode alcançar. Tais pedras serão marcadas no vetor booleano marcado. Segue o código para maior entendimento:


#include <cstdio>
#define MAXN 110
bool marcado[MAXN];
int n, m;
int main(){
scanf("%d %d", &n, &m); // leio os valores de n e m
for(int i=1; i<=m; i++){ // para cada sapo
// declaro e leio seus valores de P e D
int p, d;
scanf("%d %d", &p, &d);
// e marco as pedras que ele pode alcançar
for(int i=p%d; i<=n; i+=d)
marcado[i]=true;
}
// depois imprimo os estado de cada pedra
for(int i=1; i<=n; i++) printf("%d\n", marcado[i]);
return 0;
}

view raw

pulo.cpp

hosted with ❤ by GitHub

Nosso leitor Roger Benet também apresentou uma solução correta. Nela, ele cria uma função que recebe a pedra em que o sapo está e quantas pedras ele pode pular. Com isso, ele simula todos os possíveis pulos do sapo, para frente e para trás, e marca em um vetor todas as pedras que ele alcança. Feito isso, ele apenas imprime os estado de cada pedra: alcançada ou não.


#include <cstdio>
int pedras[110];
int n,m;
void busca (int ini,int fim,int d){
if(fim == n){
while(ini <= fim){
pedras[ini] = 1;
ini += d;
}
}
if(fim == 1) {
while(ini >= fim){
pedras[ini] = 1;
ini -= d;
}
}
}
int main(){
scanf("%d %d", &n, &m);
while(m-- > 0){
int p,dis;
scanf("%d %d", &p, &dis);
busca(p,n,dis);
busca(p,1,dis);
}
for(int i = 1; i <= n; i++)
printf("%d\n",pedras[i]);
}

view raw

pulo_roger.cpp

hosted with ❤ by GitHub