Solução por Anita Ramos
Problemas como este são muito comuns em provas de olimpíada, como a , no nível iniciante em que temos que trabalhar com uma matriz e analisar os vizinhos de um determinado ponto. Por isso, é essencial o compreendimento de toda a solução a seguir.
Iniciando a programação então, após adicionar a biblioteca e declarar as variáveis, o programa lê os primeiros valores de entrada , , e e usamos dois loops com o comando para ir de ponto em ponto no eixo X e no eixo Y e ler o valor desse ponto, por exemplo, no exemplo de entrada 1, temos que o valor de é 1, enquanto que os valores de e são 0. Depois, temos as variáveis e , que inicialmente são as coordenadas do ponto inicial, ou seja, e , que irão guardar o e o do ponto que iremos analisar.
Na parte da lógica do programa, temos um loop com o comando para checar todos os pontos da matriz. Dentro dele, vamos checar todos os vizinhos desse ponto a partir da seguinte ideia: pela coordenada do ponto principal, determinamos as coordenadas dos seus vizinhos (com auxílio dos valores de e de ). Se esse vizinho for o vizinho anterior, ou seja, o que deu origem a esse ponto que estamos analisando, não podemos o considerar (por isso, ), já que estaríamos percorrendo o trajeto do robô ao contrário. Depois, se esse vizinho não for o vizinho anterior () e seu valor for 1, então salvamos as coordenadas desse novo ponto e salvamos também as coordenadas do ponto que deu origem a esse novo, ou seja, do ponto que ainda estamos analisando. Por fim, encerramos esse loop de checar os vizinhos (então ) para seguir para o próximo ponto do caminho do robô e somamos 1 a variável para contabilizar que mais um ponto da matriz foi checado.
No final, apenas imprimimos as coordenadas do ponto final do robô e o programa retorna 0.
Segue o código comentado para melhor compreensão da solução:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<bits/stdc++.h> //biblioteca utilizada | |
using namespace std; | |
const int MAXN=1100; //define o valor de MAXN | |
int v[MAXN][MAXN]; //declara uma matriz com tamanho MAXN x MAXN | |
int vA[4]={1,0,-1,0}; //declara um vetor 'vA' já com valores na memória | |
int vB[4]={0,1,0,-1}; //declara um vetor 'vA' já com valores na memória | |
int main() | |
{ | |
int L,C,i,j,A,B,lasta=0,lastb=0,cont=0,a,b,k,d=0,la,lb; //declaração de variáveis | |
scanf("%d %d", &L, &C); //lê a primeira linha de entrada, ou seja, 'L' e 'C' | |
scanf("%d %d", &A, &B); //lê a segunda linha de entrada, ou seja, 'A' e 'B' | |
for(i=1; i<=L; i++) //parte 1 do loop para ler todos os números da matriz (nesse caso, ele vai linha por linha) | |
{ | |
for(j=1; j<=C; j++) //parte 2 do loop para ler todos os números da matriz (nesse caso, ele vai coluna por coluna) | |
{ | |
scanf("%d", &v[i][j]); //lê o valor (0 ou 1) de uma posição na matriz | |
} | |
} | |
lasta=A; //'lasta' assume o valor de 'A' | |
lastb=B; //'lastb' assume o valor de 'B' | |
while(cont<=L*C) //enquanto não checar todos os pontos de uma matriz | |
{ | |
for(k=0; k<4; k++) //loop para checar os 4 vizinhos | |
{ | |
d=0; //'d' é zerado | |
a=lasta+vA[k]; //'a' assume o valor do 'eixo x' de um vizinho | |
b=lastb+vB[k]; //'b' assume o valor do 'eixo y' de um vizinho | |
if(a==la && b==lb) //se o vizinho for o vizinho anterior, ou seja, o vizinho que deu origem a esse novo ponto | |
{ | |
d=1; //'d' assume o valor de 1 para não considerarmos esse vizinho | |
} | |
if(v[a][b]==1 && d!=1) //se o vizinho tem valor 1 e não é o vizinho anterior | |
{ | |
la=lasta; //'la' assume o valor de 'lasta' | |
lb=lastb; //'lb' assume o valor de 'lastb' | |
lasta=a; //'lasta' assume o valor de 'a' | |
lastb=b; //'lastb' assume o valor de 'b' | |
k=5; //'k' assume o valor de 5 para encerrar esse loop | |
} | |
} | |
cont++; //soma-se 1 a variável cont | |
} | |
printf("%d %d", lasta, lastb); //imprimi 'lasta' e 'lastb', ou seja, os pontos das coordenadas x e y, respectivamente da posição final do robô | |
return 0; //retorna a 0 | |
} |