fork download
  1. #include <stdio.h>
  2.  
  3. char matriz[500][500];
  4.  
  5. // Esta função analisa as bordas e atribui X na matriz se elas indicarem que sai do tabuleiro
  6. int AnalisaBordas(int linhas, int colunas, int *fila_linhas, int *fila_colunas) {
  7. int contador;
  8. int posicao_fila = 0;
  9.  
  10. for (contador = 0; contador < colunas; contador++) {
  11. // Analisa a primeira linha.
  12. if (matriz[0][contador] == 'A') {
  13. matriz[0][contador] = 'X';
  14. fila_linhas[posicao_fila] = 0;
  15. fila_colunas[posicao_fila] = contador;
  16. posicao_fila++;
  17. }
  18.  
  19. // Analisa a última linha.
  20. if (matriz[linhas - 1][contador] == 'V') {
  21. matriz[linhas - 1][contador] = 'X';
  22. fila_linhas[posicao_fila] = linhas - 1;
  23. fila_colunas[posicao_fila] = contador;
  24. posicao_fila++;
  25. }
  26. }
  27.  
  28. for (contador = 0; contador < linhas; contador++) {
  29. // Analisa a primeira coluna.
  30. if (matriz[contador][0] == '<') {
  31. matriz[contador][0] = 'X';
  32. fila_linhas[posicao_fila] = contador;
  33. fila_colunas[posicao_fila] = 0;
  34. posicao_fila++;
  35. }
  36.  
  37. // Analisa a última coluna.
  38. if (matriz[contador][colunas - 1] == '>') {
  39. matriz[contador][colunas - 1] = 'X';
  40. fila_linhas[posicao_fila] = contador;
  41. fila_colunas[posicao_fila] = colunas - 1;
  42. posicao_fila++;
  43. }
  44. }
  45.  
  46. return posicao_fila;
  47. }
  48.  
  49. // Esta função analisa os vizinhos da célula [i][j].
  50. void AnalisaVizinhos(int i, int j, int *fila_linhas, int *fila_colunas, int *posicao_fila) {
  51.  
  52. // Analisa a célula a direita.
  53. if (matriz[i][j + 1] == '<') {
  54. matriz[i][j + 1] = 'X';
  55. fila_linhas[*posicao_fila] = i;
  56. fila_colunas[*posicao_fila] = j + 1;
  57. (*posicao_fila)++;
  58. }
  59.  
  60. // Analisa a célula a esquerda.
  61. if (matriz[i][j - 1] == '>') {
  62. matriz[i][j - 1] = 'X';
  63. fila_linhas[*posicao_fila] = i;
  64. fila_colunas[*posicao_fila] = j - 1;
  65. (*posicao_fila)++;
  66. }
  67.  
  68. // Analisa a célula abaixo.
  69. if (matriz[i + 1][j] == 'A') {
  70. matriz[i + 1][j] = 'X';
  71. fila_linhas[*posicao_fila] = i + 1;
  72. fila_colunas[*posicao_fila] = j;
  73. (*posicao_fila)++;
  74. }
  75.  
  76. // Analisa a célula acima.
  77. if (matriz[i - 1][j] == 'V') {
  78. matriz[i- 1][j] = 'X';
  79. fila_linhas[*posicao_fila] = i - 1;
  80. fila_colunas[*posicao_fila] = j;
  81. (*posicao_fila)++;
  82. }
  83. }
  84.  
  85. void PropagaFila(int *fila_linhas, int *fila_colunas, int tamanho_inicial_fila) {
  86. int inicio_fila = 0;
  87. int fim_fila = tamanho_inicial_fila;
  88. while (inicio_fila < fim_fila) {
  89. AnalisaVizinhos(fila_linhas[inicio_fila], fila_colunas[inicio_fila], fila_linhas, fila_colunas, &fim_fila);
  90. inicio_fila++;
  91. }
  92. }
  93.  
  94. // Loop para adicionar os caracteres.
  95. void PreencherMatriz(int linhas, int colunas) {
  96. int linha, coluna;
  97. for (linha = 0; linha < linhas; linha++) {
  98. for (coluna = 0; coluna < colunas; coluna++) {
  99. char c;
  100. do {
  101. c = getchar();
  102. } while (c != '<' && c != '>' && c != 'V' && c != 'A');
  103. matriz[linha][coluna] = c;
  104. }
  105. }
  106. }
  107.  
  108. // Loop para adicionar os caracteres.
  109. int ContarMatriz(int linhas, int colunas) {
  110. int seguras = 0;
  111. int linha, coluna;
  112. for (linha = 0; linha < linhas; linha++) {
  113. for (coluna = 0; coluna < colunas; coluna++) {
  114. if (matriz[linha][coluna] != 'X') seguras++;
  115. }
  116. }
  117. return seguras;
  118. }
  119.  
  120. int main() {
  121. int n;
  122. scanf("%d", &n);
  123. if (n <= 0 || n > 500) {
  124. printf("Tamanho invalido para a matriz");
  125. return 1;
  126. }
  127.  
  128. PreencherMatriz(n, n);
  129.  
  130. // Cria a fila.
  131. int fila_linhas[500];
  132. int fila_colunas[500];
  133. int i;
  134. for (i = 0; i < 500; i++) {
  135. fila_linhas[i] = fila_colunas[i] = -1;
  136. }
  137.  
  138. int tamanho_inicial_fila = AnalisaBordas(n, n, fila_linhas, fila_colunas);
  139. PropagaFila(fila_linhas, fila_colunas, tamanho_inicial_fila);
  140.  
  141. int seguras = ContarMatriz(n, n);
  142.  
  143. printf("%d\n", seguras); // Exibe quantas posições são seguras.
  144. return 0;
  145. }
Success #stdin #stdout 0s 2416KB
stdin
4
>>V<
A<<<
AAA>
>>>A
stdout
11