#include <stdio.h>
char matriz[500][500];
// Esta função analisa as bordas e atribui X na matriz se elas indicarem que sai do tabuleiro
int AnalisaBordas(int linhas, int colunas, int *fila_linhas, int *fila_colunas) {
int contador;
int posicao_fila = 0;
for (contador = 0; contador < colunas; contador++) {
// Analisa a primeira linha.
if (matriz[0][contador] == 'A') {
matriz[0][contador] = 'X';
fila_linhas[posicao_fila] = 0;
fila_colunas[posicao_fila] = contador;
posicao_fila++;
}
// Analisa a última linha.
if (matriz[linhas - 1][contador] == 'V') {
matriz[linhas - 1][contador] = 'X';
fila_linhas[posicao_fila] = linhas - 1;
fila_colunas[posicao_fila] = contador;
posicao_fila++;
}
}
for (contador = 0; contador < linhas; contador++) {
// Analisa a primeira coluna.
if (matriz[contador][0] == '<') {
matriz[contador][0] = 'X';
fila_linhas[posicao_fila] = contador;
fila_colunas[posicao_fila] = 0;
posicao_fila++;
}
// Analisa a última coluna.
if (matriz[contador][colunas - 1] == '>') {
matriz[contador][colunas - 1] = 'X';
fila_linhas[posicao_fila] = contador;
fila_colunas[posicao_fila] = colunas - 1;
posicao_fila++;
}
}
return posicao_fila;
}
// Esta função analisa os vizinhos da célula [i][j].
void AnalisaVizinhos(int i, int j, int *fila_linhas, int *fila_colunas, int *posicao_fila) {
// Analisa a célula a direita.
if (matriz[i][j + 1] == '<') {
matriz[i][j + 1] = 'X';
fila_linhas[*posicao_fila] = i;
fila_colunas[*posicao_fila] = j + 1;
(*posicao_fila)++;
}
// Analisa a célula a esquerda.
if (matriz[i][j - 1] == '>') {
matriz[i][j - 1] = 'X';
fila_linhas[*posicao_fila] = i;
fila_colunas[*posicao_fila] = j - 1;
(*posicao_fila)++;
}
// Analisa a célula abaixo.
if (matriz[i + 1][j] == 'A') {
matriz[i + 1][j] = 'X';
fila_linhas[*posicao_fila] = i + 1;
fila_colunas[*posicao_fila] = j;
(*posicao_fila)++;
}
// Analisa a célula acima.
if (matriz[i - 1][j] == 'V') {
matriz[i- 1][j] = 'X';
fila_linhas[*posicao_fila] = i - 1;
fila_colunas[*posicao_fila] = j;
(*posicao_fila)++;
}
}
void PropagaFila(int *fila_linhas, int *fila_colunas, int tamanho_inicial_fila) {
int inicio_fila = 0;
int fim_fila = tamanho_inicial_fila;
while (inicio_fila < fim_fila) {
AnalisaVizinhos(fila_linhas[inicio_fila], fila_colunas[inicio_fila], fila_linhas, fila_colunas, &fim_fila);
inicio_fila++;
}
}
// Loop para adicionar os caracteres.
void PreencherMatriz(int linhas, int colunas) {
int linha, coluna;
for (linha = 0; linha < linhas; linha++) {
for (coluna = 0; coluna < colunas; coluna++) {
char c;
do {
} while (c != '<' && c != '>' && c != 'V' && c != 'A');
matriz[linha][coluna] = c;
}
}
}
// Loop para adicionar os caracteres.
int ContarMatriz(int linhas, int colunas) {
int seguras = 0;
int linha, coluna;
for (linha = 0; linha < linhas; linha++) {
for (coluna = 0; coluna < colunas; coluna++) {
if (matriz[linha][coluna] != 'X') seguras++;
}
}
return seguras;
}
int main() {
int n;
if (n <= 0 || n > 500) {
printf("Tamanho invalido para a matriz"); return 1;
}
PreencherMatriz(n, n);
// Cria a fila.
int fila_linhas[500];
int fila_colunas[500];
int i;
for (i = 0; i < 500; i++) {
fila_linhas[i] = fila_colunas[i] = -1;
}
int tamanho_inicial_fila = AnalisaBordas(n, n, fila_linhas, fila_colunas);
PropagaFila(fila_linhas, fila_colunas, tamanho_inicial_fila);
int seguras = ContarMatriz(n, n);
printf("%d\n", seguras
); // Exibe quantas posições são seguras. return 0;
}