Jump to content

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


alves077

Recommended Posts

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

Edited by alves077
Link to comment
Share on other sites

Ú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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 ...

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.