michael_hartman_cz

NTHU Introduction to Programming: Assignment 2

May 11th, 2015
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.41 KB | None | 0 0
  1. /* Michael Hartman
  2.  * NTHU Spring 2015
  3.  * X1030035
  4.  * Introduction to programming
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. typedef struct Maze
  10.  {
  11.     char ** arr;
  12.     int rows, cols;
  13.  } maze;
  14.  
  15. typedef struct Solution
  16.  {
  17.     int size, maxSize;
  18.     int * arr;
  19.  } solution;
  20.  
  21. int readDimensions ( int * c, int * r )
  22.  {
  23.     if ( scanf ( "%d %d", c, r ) != 2 || c <= 0 || r <= 0 )
  24.         return 0;
  25.     return 1;
  26.  }
  27.  
  28. void initMaze ( maze * m )
  29.  {
  30.     int i;
  31.     m -> arr = ( char ** ) malloc ( m -> rows * sizeof ( char * ) );
  32.     for ( i = 0; i < m -> rows; ++ i )
  33.         m -> arr[i] = ( char * ) malloc ( m -> cols * sizeof( char ) );
  34.  }
  35.  
  36. void initSolution ( solution * s )
  37.  {
  38.     s -> size = 0;
  39.     s -> maxSize = 10;
  40.     s -> arr = ( int * ) malloc ( s -> maxSize * sizeof ( int ) );
  41.  }
  42.  
  43. void reallocSolution ( solution * s )
  44.  {
  45.     s -> maxSize *= 2;
  46.     s -> arr = ( int * ) realloc ( s -> arr, s -> maxSize * sizeof ( int ) );
  47.  }
  48.  
  49. void pushSolution ( int i, solution * s )
  50.  {
  51.     if ( s -> size == s -> maxSize )
  52.         reallocSolution ( s );
  53.     s -> arr[ s-> size ++ ] = i;
  54.  }
  55.  
  56. void freeSolution ( solution * s )
  57.  {
  58.     free ( s -> arr );
  59.     s -> arr = NULL;
  60.  }
  61.  
  62. void printSolution ( solution * s )
  63.  {
  64.     int i;
  65.     for ( i = s -> size - 1; i > 2; i -= 2 )
  66.         printf ( "(%d,%d)->", s -> arr[i-1], s -> arr[i] );
  67.     printf ( "(%d,%d)\n", s -> arr[0], s -> arr[1] );
  68.  }
  69.  
  70. void freeMaze ( maze * m )
  71.  {
  72.     int i;    
  73.     for ( i = 0; i < m -> rows; ++ i )
  74.         free ( m -> arr[i] );
  75.     free ( m -> arr );
  76.     m -> arr = NULL;
  77.  }
  78.  
  79. int readMaze ( maze * m )
  80.  {
  81.     int i, j;
  82.     getchar();
  83.     for ( i = 0; i < m -> rows; ++ i )
  84.      {
  85.         for ( j = 0; j < m -> cols; ++ j )
  86.             m -> arr[i][j] = getchar();
  87.         getchar();
  88.      }
  89.     return 1;
  90.  }
  91.  
  92. void printMaze ( maze * m )
  93.  {
  94.     int i, j;
  95.     for ( i = 0; i < m -> rows; ++ i )
  96.      {
  97.         printf ( "\n" );
  98.         for ( j = 0; j < m -> cols; ++j )
  99.             printf ( "%c", m -> arr[i][j] );
  100.      }
  101.    
  102.     printf ( "\n" );
  103.  }
  104.  
  105. int pushCoords ( int c, int r, solution * s )
  106.  {
  107.     pushSolution ( c, s );
  108.     pushSolution ( r, s );
  109.     return 1;
  110.  }
  111.  
  112. int solveMaze ( maze * m, solution * s, int c, int r )
  113.  {
  114.     if ( c < 0 || r < 0 || c >= m -> cols || r >= m -> rows )
  115.         return 0;
  116.     if ( m -> arr[r][c] == '1' || m -> arr[r][c] == '2' || m -> arr[r][c] == '3' )
  117.         return 0;
  118.     m -> arr[r][c] = '2';
  119.     if ( c == m -> cols - 1 && r == m -> rows - 1 )
  120.         return pushCoords ( c, r, s );
  121.     if ( solveMaze ( m, s, c, r - 1 ) )
  122.         return pushCoords ( c, r, s );
  123.     if ( solveMaze ( m, s, c + 1, r ) )
  124.         return pushCoords ( c, r, s);
  125.     if ( solveMaze ( m, s, c, r + 1 ) )
  126.         return pushCoords ( c, r, s );
  127.     if ( solveMaze ( m, s, c - 1, r ) )
  128.         return pushCoords ( c, r, s );
  129.     m -> arr[r][c] = '3';
  130.     return 0;    
  131.  }
  132.  
  133. int main ( int argc, char ** argv )
  134.  {
  135.     maze m;
  136.     solution s;
  137.     int i, j;
  138.     if ( ! readDimensions ( & m . cols, & m . rows ) )
  139.      {
  140.         printf ("Dimensions reading failed!\n");
  141.         return 1;
  142.      }
  143.      
  144.     initMaze ( & m );
  145.     readMaze ( & m );
  146.     initSolution ( & s );
  147.    
  148.     if ( solveMaze ( & m, & s, 0, 0 ) )
  149.         printSolution ( & s );
  150.     else
  151.         printf ( "No way out!\n" );
  152.  
  153.     freeMaze ( & m );
  154.     freeSolution ( & s );
  155.     return 0;
  156.  }
Advertisement
Add Comment
Please, Sign In to add comment