Jump to content
WolfmanZ

Duvida em c

Recommended Posts

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

Edited by thoga31
Correcção das tags code

Share this post


Link to post
Share on other sites
HappyHippyHippo

não dás informação suficiente : qual a regra de conversão ?


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

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites
Rui Carlos

Já agora, a simplicidade do algoritmo apresentado no post anterior assenta na recursividade. Convém que domines minimamente este conceito para resolveres o problema.

Share this post


Link to post
Share on other 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;
                }
    }
 }
}

Edited by WolfmanZ

Share this post


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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Edited by WolfmanZ

Share this post


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

Share this post


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

Share this post


Link to post
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.