Jump to content

Duvida em c


WolfmanZ
 Share

Recommended Posts

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

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

Link to comment
Share on other sites

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

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


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

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

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