fork(14) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void print_position(int x, int y);
  5.  
  6. void print_maze(char **maze, int largura, int altura);
  7.  
  8. int labirinto(int x_atual, int y_atual, char **maze, int largura, int altura) {
  9. // Se tentou sair do labirinto, este não é o caminho certo.
  10. if (x_atual < 0 || x_atual >= largura || y_atual < 0 || y_atual >= altura) return 0;
  11.  
  12. char aqui = maze[x_atual][y_atual];
  13.  
  14. // Verifica se achou a saída.
  15. if (aqui == 'S') return 1;
  16.  
  17. // Se bateu na parede ou voltou para algum lugar que já esteve,
  18. // então este não é o caminho certo.
  19. if (aqui == 'X' || aqui == '>' || aqui == '<' || aqui == 'v' || aqui == '^') return 0;
  20.  
  21. // Tenta ir para cima.
  22. maze[x_atual][y_atual] = '^';
  23. if (labirinto(x_atual, y_atual + 1, maze, largura, altura)) return 1;
  24.  
  25. // Tenta ir para baixo.
  26. maze[x_atual][y_atual] = 'v';
  27. if (labirinto(x_atual, y_atual - 1, maze, largura, altura)) return 1;
  28.  
  29. // Tenta ir para a esquerda.
  30. maze[x_atual][y_atual] = '<';
  31. if (labirinto(x_atual - 1, y_atual, maze, largura, altura)) return 1;
  32.  
  33. // Tenta ir para a direita.
  34. maze[x_atual][y_atual] = '>';
  35. if (labirinto(x_atual + 1, y_atual, maze, largura, altura)) return 1;
  36.  
  37. // Não deu, então volta.
  38. maze[x_atual][y_atual] = 'O';
  39. return 0;
  40. }
  41.  
  42. int main(void) {
  43. int largura, altura, x_entrada, y_entrada;
  44. scanf("%d %d\n", &largura, &altura);
  45. char **a = malloc(largura * sizeof(char*));
  46. for (int x = 0; x < largura; x++) {
  47. a[x] = malloc(altura * sizeof(char));
  48. }
  49. for (int y = altura - 1; y >= 0; y--) {
  50. for (int x = 0; x < largura; x++) {
  51. a[x][y] = getchar();
  52. if (a[x][y] == 'E') {
  53. x_entrada = x;
  54. y_entrada = y;
  55. }
  56. }
  57. getchar(); //pegar a quebra de linha
  58. }
  59. printf("Entrada:\n");
  60. print_maze(a, largura, altura);
  61. labirinto(x_entrada, y_entrada, a, largura, altura);
  62. printf("\nSaída:\n");
  63. print_maze(a, largura, altura);
  64. return 0;
  65. }
  66.  
  67. void print_maze(char **maze, int largura, int altura) {
  68. int x, y;
  69. for (y = altura - 1; y >= 0; y--) {
  70. for (x = 0; x < largura; x++) {
  71. printf("%c", maze[x][y]);
  72. }
  73. printf("\n");
  74. }
  75. }
  76.  
  77. void print_position(int x, int y) {
  78. printf("(%d, %d)", x, y);
  79. }
Success #stdin #stdout 0s 9416KB
stdin
5 6
XOSXX
OOOXX
OXXXX
OXXOX
OXXOX
OOOEX
stdout
Entrada:
XOSXX
OOOXX
OXXXX
OXXOX
OXXOX
OOOEX

Saída:
X>SXX
>^OXX
^XXXX
^XXOX
^XXOX
^<<<X