# Duvida em c

## 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;
}
```

Edited by thoga31
Correcção das tags code
##### Share on other sites

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

 IRC : sim, é algo que ainda existe >> #p@p
##### 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

##### 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
##### Share on other sites

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 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
##### Share on other sites

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 on other sites

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 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
##### Share on other sites

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

## Create an account

Register a new account

×

• #### Revista PROGRAMAR

• Wiki
• IRC
×
• Create New...