Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

alves077

[Resolvido] [Dúvida] Percorrer array 2D

Mensagens Recomendadas

alves077

Boa noite,

Queria percorrer uma matriz recursivamente, mas estou com dificuldades, ele entra em ciclo infinito e não pára.




int rec(int x, int y, int rows,int tabela[50][50])
{
if(x==rows-1)
{
	return 0;
}
else
{
	   if(tabela[x][y]==0)
	   {
			printf(",(%d,%d)",(x+1),y);
			rec(x+1,y,rows,tabela);
	   }
	   else
	   {

			 printf(",(%d,%d)",i+1,(j)+1);
			rec(x+1,y+1,rows,tabela);
	  } }
}

Queria que ele fizesse determinado print em alguns índices da tabela, alguma ideia do que possa ser? Não sei se estou a fazer o melhor uso para a recursividade...

Obrigado pela atenção,

alves077

Editado por alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Não estava a versão completa, entretanto diminui a função não cheguei a compilar mas a ideia é esta, tenho alguns erros sintaxe, mas a logica é o que tenho,.

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

entretanto diminui a função não cheguei a compilar

mas estou com dificuldades, ele entra em ciclo infinito e não pára.

como podes afirmar se entra em ciclo infinito sem confirmação ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Única coisa que alterei foi so mais uns casos (else if), não me parecia que fosse por isso, pensei que fosse mais pelo modo como utilizo a recursão. Chamo a função no main com rec(0,0,tabela). Depois quero andar entre determinados pontos (x,y), e verifico qual o ponto, e chamo recursivamente nesse ponto, se chegasse ao final da matriz, entrava naquele if, mas ele percorria sem parar....

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

O x,y são as coordenadas actuais (x=linha,y=colunas), enquanto o rows é o número máximo de linhas possiveis. Restando a tabela que é a matriz de inteiros

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o código apresentado não deverá entrar um ciclo infinito/longo se o valor de entra de "x" for menor que o valor de "rows"

agora, o problema é :

- ou não apresentaste todo o código

- ou o ciclo infinito encontrasse noutro local não apresentado (ciclo exterior)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Como tinha o código:


int rec(int x, int y, int rows,int matriz[50][50])
{
   if(x==rows-1)
   {
       return 0;
   }
   else
   {
       if(matriz[x][y]!=0)
       {
           if(matriz[x][y]==1)
           {
               printf("%d,%d",(i+1),(j)+1);
               rec(x+1,y,rows,matriz);
               sleep(3);
           }
           else if(matriz[x][y]==2)
           {
               printf("%d,%d",i-1,j);
               rec(x-1,y,rows,matriz);
           }
           else if(matriz[x][y]==3)
           {
               printf("%d,%d"(i+1,j+1);
               rec(x+1,y-1,rows,matriz);
           }
           else if(matriz[x][y]==4)
           {
               printf("%d,%d",i+11,j-1);
               rec(x-1,y+1,rows,matriz);
           }
       }
   }
}

No main chamava esta função num ciclo, mas tenho a garantia que só entra uma vez na condição dentro da função. já fiz printf sem a parte recursiva da função e ele só da output uma vez, logo só entra uma vez na função.

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

agora só falta saber a matriz que estás a usar, o x e o y

(porque consigo criar aqui uma matrix que te poem andar à roda sem para em 3 tempos)

1
2
3

resultado : baixo->cima->baixo->cima->baixo->cima

ps : vez a diferença => não dás o código, não tens resposta, dás o código, tens resposta ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Tens razão HappyHippyHippo, não quis por o código para não carregar isto, formatei, mas formatei mal....

Tem ideia como posso evitar isso? Queria andar em certos índices na matriz, não percorrendo toda, recursivamente pareceu me boa ideia, mas assim como faço realmente isto não saí daqui...

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

depende sempre do que queres fazer, por ventura o que estás a tentar fazer não é a melhor solução para o problema.

no entanto, existe um passo para resolver este problema

- "verificação de que não voltas ao mesmo local"

isso pode ser feito de várias maneiras, mas a mais simples é teres uma matriz auxiliar do mesmo tamanho que esta, inicializada a zeros, e actualizada a 1 sempre que visitas uma posição.

quando saltas para uma posição que não tenha um valor a zero, significa que voltaste a uma posição já visitada e imperativamente entrarás num ciclo


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
alves077

Estava a ver se não acrescentava outra matriz há solução, já estou a ocupar demasiada memória, sem essa solução não consigo prevenir ciclos? O problema é mais ou menos, em cada índice o conteúdo desse índice que leio diz me para onde devo ir na matriz. Posso sempre percorrer a matriz normalmente com dois ciclos, em cada entrada vejo a entrada actual se for para fazer printf, faço e printf a que o conteúdo do ponto disser, e meto esse ponto como lido, e sigo mas acho que isto não bate certo...

Obrigado pela atenção,

alves077

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

acho que houve uma actualização durante a noite que fez apagar o meu post ...

é assim, existe uma solução para o teu caso. como não existem valores negativos na tua matrix, o que podes fazer é:

- sempre que chegas a uma nova posição (chamada da função)

- verificas se o valor é negativo

- se sim, então entraste num ciclo

- se não, altera o valor para o negativo (multiplica por -1)

podes também criar uma função auxiliar que "limpa" o processo ao iterar toda a matriz e multiplica todos os valores negativos por -1


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.