This repository has been archived by the owner on Oct 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
buscaRecursiva.c
77 lines (55 loc) · 1.78 KB
/
buscaRecursiva.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
#include "prototipos.h"
// ------ Algoritmo recursivo de Flood Fill ------ //
const int dir[8][2] = {{-1,0}, // sobe
{-1,1}, // sobre-direita (diagonal)
{0,1}, // direita
{1,1}, // desce-direita
{1,0}, // desce
{1,-1}, // desce-esquerda
{0,-1}, // esquerda
{-1,-1}};// sobe-esquerda
Lista* li2;
int modificado;
Lista* floodFill(int** M, int x0, int y0, int xSize, int ySize, int* count){
extern int contagem;
contagem+=16; // atribuicao de valores a matriz dir[8][2]
contagem+=3;
li2 = cria_lista();
modificado = 0;
contagem++;
buscaRecursiva(M,x0,y0,xSize,ySize,M[x0][y0]);
contagem++;
*count = modificado;
return li2;
}
void buscaRecursiva(int** M, int x0, int y0, int xSize, int ySize, int ref){
int i;
extern int contagem;
contagem+=2;
if(x0 < 0 || y0 < 0)
return;
contagem+=2;
if(x0 >= xSize || y0 >= ySize)
return;
contagem++;
if(M[x0][y0] == ref){
// troca do valor da posição já visitada da matriz para a recursão não entrar em loop:
M[x0][y0] = !ref;
modificado++;
contagem+=3;
Tipo_Dado pos;
pos.x = x0;
pos.y = y0;
contagem+=2;
insere_lista(li2,pos); contagem++;
// chamada recursiva para cada uma das 8 posicoes vizinhas:
contagem+=2; // inicializacao e ultima comparacao do for
for(i = 0; i < 8; i++){
contagem+=4; // comparacao, incremento(+2) e chamada da funcao
buscaRecursiva(M, x0+dir[i][0], y0+dir[i][1], xSize, ySize, ref);
}
}
return;
}