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

WolfmanZ

Duvida em c

Mensagens Recomendadas

WolfmanZ

Boas tenho uma pequena duvida num exercicio?

tendo uma matriz :

1 1 0 0 0 0 0 0 1 1

0 1 1 0 0 1 1 1 1 1

0 1 0 1 1 0 1 0 0 0

1 1 0 1 1 1 0 1 1 1

0 0 0 1 1 1 1 1 1 0

0 1 0 0 0 1 1 0 1 1

1 1 1 0 1 1 0 0 1 1

1 1 0 1 0 0 0 0 1 1

0 1 0 0 0 0 0 1 0 0

0 0 1 0 1 0 0 0 0 0

o objectivo é passar os respectivos grupos de "1" a outros numeros de modo a ficar assim:

2 2 0 0 0 0 0 0 3 3

0 2 2 0 0 3 3 3 3 3

0 2 0 4 4 0 3 0 0 0

2 2 0 4 4 4 0 4 4 4

0 0 0 4 4 4 4 4 4 0

0 5 0 0 0 4 4 0 4 4

5 5 5 0 4 4 0 0 4 4

5 5 0 6 0 0 0 0 4 4

0 5 0 0 0 0 0 7 0 0

0 0 8 0 9 0 0 0 0 0

eu neste momento cheguei a isto:

2 2 0 0 0 0 0 0 3 3

0 2 2 0 0 3 3 3 3 3

0 2 0 1 1 0 3 0 0 0

2 2 0 1 1 1 0 1 1 1

0 0 0 1 1 1 1 1 1 0

0 4 0 0 0 1 1 0 1 1

4 4 4 0 1 1 0 0 1 1

4 4 0 5 0 0 0 0 1 1

0 4 0 0 0 0 0 6 0 0

0 0 7 0 8 0 0 0 0 0

#include<stdio.h>
int main(){int n,k,l,m,i,j,cor=1,cont=0;
scanf("%d %d",&n,&m);int matrix[n][m], r[n][m];
int v[n];

for(i=0;i<n;i++){
 v[i]=-1;
}
for(i=0;i<n;i++){
   for(j=0;j<m;j++){
       scanf("%d",&matrix[i][j]);
   }
}
//linha 1
for(i=0;i<1;i++){
   for(j=0;j<m;j++){
if(matrix[i][j]==0) r[i][j]=0;
else{
 if(matrix[i][j-1]==1){
  r[i][j]=cor; 
 }
 else{
  cor=cor+1;
  r[i][j]=cor;
 }
}

   }}
//caso geral
for(i=1;i<n;i++){
   for(j=0;j<m;j++){
       if(matrix[i][j]==0) r[i][j]=0;
       else{
           if(matrix[i-1][j]==1){//cima
               r[i][j]=r[i-1][j];
           }
           else{
 if(matrix[i][j-1]==1){//esquerda
  r[i][j]=r[i][j-1]; 
 }
 else{
  if(matrix[i][j+1]==1){
   r[i][j]=1;

  }
  else{
                 cor++;
                 r[i][j]=cor;
  }
            }
          }
    }
   }
}
printf("\n");
for(i=0;i<n;i++){
   for(j=0;j<m;j++){
       printf("%d ",r[i][j]);
   }
   printf("\n");
}

for(i=0;i<n;i++){
   for(j=m-1;j>=0;j--){
if(r[i][j]==0) r[i][j]=0;
else{ if(r[i][j]==1){
  if(r[i][j+1]!=0){
   r[i][j]=r[i][j+1];
  }
  else{
   if(r[i-1][j]!=0){//cima
            r[i][j]=r[i-1][j];
       }
  }
 }
 else{
  r[i][j]=r[i][j];
 }
}
   }
}for(i=1;i<n;i++){
   for(j=0;j<m;j++){
       if(r[i][j]!=0 && r[i][j]!=1){ v[r[i][j]]=1;
       }

   }
}

printf("\n");
for(i=0;i<n;i++){
   for(j=0;j<m;j++){
       printf("%d ",r[i][j]);
   }
   printf("\n");
}
return 0;
}

obrigado desde ja pela ajuda

Editado por thoga31
Correcção das tags code

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
WolfmanZ

basicamente se tiveres um grupo de "1" tens de ver se por esses "1" todos por exemplo de "2" imagina que sao cores.

primeiras 2 linhas:

1 1 0 0 0 0 0 0 1 1

0 1 1 0 0 1 1 1 1 1

2 2 0 0 0 0 0 0 3 3

0 2 2 0 0 3 3 3 3 3

ao mudares as "cores" o primeiro grupo de "1" é 2 e depois é incrementando a "cor"

o que eu tou a fazer em cima é percorrer a matriz uma vez e verificar se em cima ou a esquerda tambem é 1. so que ao fazer so esquerda e cima logo na primeira linha há 3 "1's" que tem 0 por cima e a esquerda nao tem "cor" definida. para isso eu volto a percorrer a matriz e faço a verificaçao à direita e resolvo esse caso so que na depois fico com um grupo de "1's" que nao consigo mudar e ao mudar esse grupo vou ter que aumentar a "cor" dos grupos a seguir!

nao sei se consegui esclarecer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu não sei por onde pegar no teu código ...

eu tenho isso resolvido (tudo) em menos de 60 linhas (inicialização, processo e apresentação)

pseudo-código:

- marcar a cor actual como 1
- para todos as linhas da matrix
 - para todos as colunas da matrix
   - se o elemento da linha e coluna iterada tiver a cor 1
     - incrementar a cor
     - pintar a posição com a cor

(pintar posição)
- marcar a posição da matrix com a cor
- se existir elemento à esquerda e este tiver a cor 1
 - pintar a posição com a cor
- se existir elemento à direita e este tiver a cor 1
 - pintar a posição com a cor
- se existir elemento acima e este tiver a cor 1
 - pintar a posição com a cor
- se existir elemento abaixo e este tiver a cor 1
 - pintar a posição com a cor


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
WolfmanZ

so agora é que pude voltar ao exercicio e vendo o psedo-código deixado em cima pelo HappyHIppyHippo pelo que entendi fiz o seguinte codigo mas nao funciona:

for(i=1;i<n;i++){
for(j=0;j<m;j++){
       if(matrix[i][j]==0){
           r[i][j]=0;
        }
       else{ //se casa for 1
                  cor++;
                  if(matrix[i][j-1]==1){
                          r[i][j]=cor;
                  }
                 if(matrix[i][j+1]==1){
                      r[i][j]=cor;
                 }
                if(matrix[i-1][j]==1){
                          r[i][j]=cor;
                }
                 if(matrix[i+1][j]==1){
                      r[i][j]=cor;
                }
    }
 }
}

Editado por WolfmanZ

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

visto que foi isso que interpretaste do pseudo-código, faz a relação das instruções do pseudo-código e as de C através de comentário no código de C e apresenta aqui


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Estuda o conceito de recursividade. Sem perceberes isto, não vais perceber o algoritmo que te foi apresentado (e consequentemente, em que é a tua implementação difere do algoritmo apresentado). Basicamente, a função/procedimento pintar posição deverá ser recursiva.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
WolfmanZ


int cor=1;

for(i=1;i<n;i++){ //para todos as linhas da matrix
	for(j=0;j<m;j++){ //para todos as colunas da matrix
	if(matrix[i][j]==0){
		r[i][j]=0;
	 }
	else{ //se o elemento da linha e coluna iterada tiver a cor 1
			   cor++; //incrementar a cor
			   if(matrix[i][j-1]==1){ //se existir elemento à esquerda e este tiver a cor 1
					   r[i][j]=cor; //- pintar a posição com a cor
			   }
			  if(matrix[i][j+1]==1){//se existir elemento à direita e este tiver a cor 1
				   r[i][j]=cor;  //- pintar a posição com a cor
			  }
			 if(matrix[i-1][j]==1){//se existir elemento à cima e este tiver a cor 1
					   r[i][j]=cor;  //- pintar a posição com a cor
			 }
			  if(matrix[i+1][j]==1){ //se existir elemento baixo e este tiver a cor 1
				   r[i][j]=cor;  //- pintar a posição com a cor
			 }
 }
 }
}

o que sugeriste no psedo-codigo foi fazer a instruçao pintar a posiçao com a cor numa funçao?

Editado por WolfmanZ

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

primeiro, se existe código prai espalhado que não tem relação, então está a mais

segundo, não tens uma relação directa para todas as entradas do pseudo-cõdigo, logo está incompleto

terceiro, sim, pintar com a cor é uma função


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

bem ... apesar de ainda não ter feito uma semana ...

#include <stdio.h>

#define LINES   10
#define COLUMNS 10

void paint(int matrix[LINES][COLUMNS], int i, int j, int color) {
 matrix[i][j] = color;                           /* pintar celula */

 if (i > 0 && matrix[i - 1][j] == 1)             /* verificar celula a oeste */
   paint(matrix, i - 1, j, color);               /* pintar celula */
 if (i < LINES - 1 && matrix[i + 1][j] == 1)     /* verificar celula a este */
   paint(matrix, i + 1, j, color);               /* pintar celula */
 if (j > 0 && matrix[i][j - 1] == 1)             /* verificar celula a norte */
   paint(matrix, i, j - 1, color);               /* pintar celula */
 if (j < COLUMNS - 1 && matrix[i][j + 1] == 1)   /* verificar celula a sul */
   paint(matrix, i, j + 1, color);               /* pintar celula */
}

int main(int argc, char** argv) {
 int matrix[LINES][COLUMNS] = {{1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
                               {0, 1, 1, 0, 0, 1, 1, 1, 1, 1},
                               {0, 1, 0, 1, 1, 0, 1, 0, 0, 0},
                               {1, 1, 0, 1, 1, 1, 0, 1, 1, 1},
                               {0, 0, 0, 1, 1, 1, 1, 1, 1, 0},
                               {0, 1, 0, 0, 0, 1, 1, 0, 1, 1},
                               {1, 1, 1, 0, 1, 1, 0, 0, 1, 1},
                               {1, 1, 0, 1, 0, 0, 0, 0, 1, 1},
                               {0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
                               {0, 0, 1, 0, 1, 0, 0, 0, 0, 0}};
 int color = 1;

 for (int i = 0; i < LINES; i++) {               /* ciclo das linhas */
   for (int j = 0; j < COLUMNS; j++) {           /* ciclo das colunas */
     if (matrix[i][j] == 1)                      /* verificar celula por pintar */
       paint(matrix, i, j, ++color);             /* pintar celula com a cor seguinte */
   }
 }

 for (int i = 0; i < LINES; i++) {               /* ciclo das linhas */
   for (int j = 0; j < COLUMNS; j++) {           /* ciclo das colunas */
     printf("%d ", matrix[i][j]);                /* apresentar celula */
   printf("\n");                                 /* mudar de linha */
 }

 return 0;
}

ps : afinal é em menos de 50 linhas (com 10 só de inicialização da matriz)


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.