Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <string>
- using namespace std;
- //BSF ~
- typedef struct nofila
- {
- int i;
- int j;
- struct nofila* proximo;
- } No;
- typedef struct fila
- {
- No* cabeca;
- No* rabo;
- int numElementos;
- } Fila;
- Fila* inicializar()
- {
- Fila* f = new Fila();
- f->cabeca = f->rabo = NULL;
- f->numElementos = 0;
- return f;
- }
- //Insere no rabo
- void insere(Fila* f, int i, int j)
- {
- f->numElementos++;
- No* novo = new No();
- novo -> i = i;
- novo -> j = j;
- novo ->proximo = NULL;
- if (!f->cabeca)
- {
- f->cabeca = f->rabo = novo;
- return;
- }
- f->rabo->proximo = novo;
- f->rabo = novo;
- }
- //Retira da cabeça
- No* retira(Fila* f)
- {
- if (!f->cabeca)
- {
- return NULL;
- }
- f->numElementos--;
- No* ret = f->cabeca;
- if (f->cabeca == f->rabo)
- {
- f->cabeca = f->rabo = NULL;
- return ret;
- }
- No* aux = f->cabeca;
- f->cabeca = f->cabeca->proximo;
- delete(aux);
- return ret;
- }
- void imprimeFila(Fila* f)
- {
- No* p;
- for (p = f->cabeca; p != NULL; p = p->proximo)
- {
- if (p->proximo == NULL)
- cout << "[" << p->i << "," << p->j << "]";
- else
- cout << "[" << p->i << "," << p->j << "]" << " ";
- }
- }
- Fila* esvaziarFila(Fila* f)
- {
- while (f->numElementos > 0)
- retira(f);
- return f;
- }
- bool isVazia(Fila* f)
- {
- return f->cabeca == NULL;
- }
- bool existe(Fila* f, int n, int m)
- {
- No* aux = f->cabeca;
- while (aux != NULL)
- {
- if (aux->i == n && aux->j == m)
- return true;
- aux = aux->proximo;
- }
- return false;
- }
- int numElementos(Fila* f)
- {
- No* aux = f->cabeca;
- int n = 0;
- while (aux)
- {
- n++;
- aux = aux->proximo;
- }
- return n;
- }
- int main()
- {
- freopen("L3Q3.in", "r", stdin);
- freopen("L3Q3.out", "w", stdout);
- int k; //k de "kasos"
- int q, n, m; //Matriz ~
- cin >> k;
- while (k > 0)
- {
- int saida = 0;
- cin >> q;
- cin >> n;
- cin >> m;
- // cout << q << " " << n << " " << m << endl;
- int mapa[n][m];
- //Lê a matriz
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- cin >> mapa[i][j];
- }
- }
- // for (int i = 0; i < n; i++)
- // {
- // for (int j = 0; j < m; j++)
- // {
- // if (j == m-1)
- // cout << mapa[i][j] << endl;
- // else
- // cout << mapa[i][j] << " ";
- // }
- // }
- // cout << "chegou aqui";
- //Faz BFS
- Fila* f = new Fila();
- f = inicializar();
- bool marcados[n][m]; //inicializa array
- // cout << "passa do bool";
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if(mapa[i][j] > q)
- {
- marcados[i][j] = true; //marcando o que não é buraco
- }
- if (!marcados[i][j]) //É buraco
- {
- marcados[i][j] = true;
- insere(f, i, j);
- while (!isVazia(f))
- {
- No* aux = retira(f);
- int minSubX = ((aux->i -1) < 0) ? 0 : aux->i -1 ;
- int minSubY = ((aux->j-1) <0) ? 0 : aux->j -1 ;
- int maxSubX = ((aux->i +1) > n) ? n : aux->i +1 ;
- int maxSubY = ((aux->j+1) >= m) ? m : aux->j +1 ;
- for(int x = minSubX; x <= maxSubX; x++)
- {
- for(int y = minSubY; y <= maxSubY; y++)
- {
- if(x != i || y != j)
- {
- if(mapa[x][y] <= q && !marcados[x][y])
- {
- // cout << "valorI:" << x << " ValorJ:" << y << " Tipo:" << mapa[x][y] << endl;
- marcados[x][y] = true;
- insere(f, x, y);
- }
- }
- }
- }
- }
- saida++;
- }
- }
- }
- cout << saida << endl;
- // //Teste vizinhos
- // int i = 0, j = 0;
- // cout << "vizinhos de " << "[" << i << ", " << j << "]";
- // for(int x = max(0, i-1); x <= min(i+1, n); x++)
- // {
- // for(int y = max(0, j-1); y <= min(j+1, m); y++)
- // {
- // if(x != i || y != j)
- // {
- // cout << "valorI:" << x << "ValorJ:" << y << "Tipo:" << mapa[x][y] << endl;
- // }
- // }
- // }
- //fim BFS
- k--;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement