Advertisement
frain8

Untitled

Nov 21st, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | None | 0 0
  1. /* Dasprog C - 2019
  2. William Handi Wijaya
  3. 0087
  4.  
  5. Program untuk mencari jalan yang dapat dilalui oleh tikus (2)
  6. dalam suatu labirin agar tikus mendapatkan keju (3).
  7. (1) = jalan, (0) = tembok
  8. (Input berasal dari stdin)
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #define limit 100
  14.  
  15. // Prototipe fungsi
  16. int get_ukuran(void);
  17. int get_maze(int soal[][limit]);
  18. bool valid(int soal[][limit], int x, int y, bool visited[][limit]);
  19. bool check_move(int soal[][limit], int x, int y, int hasil[][limit], bool visited[][limit]);
  20. void print_arr(int arr[][limit]);
  21.  
  22. // Declarasikan variabel global
  23. int size;
  24. int start_x, start_y;
  25. int end_x, end_y;
  26.  
  27. int main(void)
  28. {
  29.     // Dapatkan ukuran
  30.     if (get_ukuran() != 0) return 1;
  31.  
  32.     // Deklarasikan array
  33.     int soal[size][limit], hasil[size][limit];
  34.  
  35.     // Deklarasikan flag
  36.     bool visited[size][limit];
  37.  
  38.     // Isi tiap array
  39.     memset(hasil, 0, sizeof(int) * size * limit);
  40.     memset(visited, false, sizeof(bool) * size * limit);
  41.  
  42.     // Dapatkan maze dari user input
  43.     // Jika input invalid, stop program
  44.     if (get_maze(soal) != 0) return 2;
  45.  
  46.     // Print check_move result
  47.     // Jika solusi ada
  48.     if (check_move(soal, start_x, start_y, hasil, visited))
  49.     {
  50.         printf("\nSolusi:\n");
  51.         print_arr(hasil);
  52.     }
  53.     // Jika solusi tidak ada
  54.     else
  55.     {
  56.         printf("\nSolusi tidak ada\n");
  57.         return 3;
  58.     }
  59.     return 0;
  60. }
  61.  
  62. // Function
  63. int get_ukuran(void)
  64. {
  65.     // Prompt user untuk memberikan ukuran maze
  66.     printf("Ukuran maze (jangan melampaui %d): ", limit);
  67.     scanf("%d", &size);
  68.  
  69.     // Jika size is too big, stop program
  70.     if (size > limit)
  71.     {
  72.         printf("Ukuran maze telah melampaui batas !\n");
  73.         return 1;
  74.     }
  75.     return 0;
  76. }
  77.  
  78. int get_maze(int soal[][limit])
  79. {
  80.     // Deklarasikan variabel penyimpan banyaknya tikus dan keju
  81.     int count_2 = 0;
  82.     int count_3 = 0;
  83.  
  84.     // Prompt user untuk memberikan maze layout
  85.     printf("Input %dx%d maze ! (2 = tikus and 3 = keju)\n", size, size);
  86.     // Untuk setiap column
  87.     for (int y = 0; y < size; y++)
  88.     {
  89.         // Untuk setiap row
  90.         for (int x = 0; x < size; x++)
  91.         {
  92.             // Simpan user input
  93.             scanf("%d", &soal[x][y]);
  94.             // Validate input
  95.             if (soal[x][y] == 2 || soal[x][y] == 3)
  96.             {
  97.                 // Dapatkan start koordinat
  98.                 if (soal[x][y] == 2)
  99.                 {
  100.                     count_2++;
  101.                     start_x = x;
  102.                     start_y = y;
  103.                 }
  104.                 // Dapatkan stop koordinat
  105.                 else if (soal[x][y] == 3)
  106.                 {
  107.                     count_3++;
  108.                     end_x = x;
  109.                     end_y = y;
  110.                 }
  111.                 // Jika tikus/keju lebih dari satu, stop program
  112.                 if (count_2 > 1 || count_3 > 1)
  113.                 {
  114.                     printf("Terlalu banyak tikus/keju\n");
  115.                     return 2;
  116.                 }
  117.             }
  118.             // Jika user input berada di luar range x (0 <= x <= 3), stop program
  119.             else if (soal[x][y] != 0 && soal[x][y] != 1)
  120.             {
  121.                 printf("Invalid Input\n");
  122.                 return 3;
  123.             }
  124.         }
  125.     }
  126.     // Jika tidak ada tikus/keju, stop program
  127.     if (count_2 == 0 || count_3 == 0)
  128.     {
  129.         printf("Posisi tikus/keju tidak diketahui\n");
  130.         return 4;
  131.     }
  132.     return 0;
  133. }
  134.  
  135. // Cek validitas dari koordiat saat ini (dalam sumbu x dan y)
  136. bool valid(int soal[][limit], int x, int y, bool visited[][limit])
  137. {
  138.     if (0 <= x && x <= size - 1 && 0 <= y && y <= size - 1 && soal[x][y] != 0 && visited[x][y] == false)
  139.     {
  140.         return true;
  141.     }
  142.     else return false;
  143. }
  144.  
  145. // Dapatkan solusi
  146. bool check_move(int soal[][limit], int x, int y, int hasil[][limit], bool visited[][limit])
  147. {
  148.     // Base case
  149.     // Jika curr_coordinate = keju, stop loop
  150.     if (x == end_x && y == end_y)
  151.     {
  152.         hasil[x][y] = soal[x][y];
  153.         visited[x][y] = true;
  154.         return true;
  155.     }
  156.     // Recursive case
  157.     if (valid(soal, x, y, visited))
  158.     {
  159.         hasil[x][y] = soal[x][y];
  160.         visited[x][y] = true;
  161.  
  162.         if (check_move(soal, x, y - 1, hasil, visited)) return true; // Check up
  163.         if (check_move(soal, x, y + 1, hasil, visited)) return true; // Check down
  164.         if (check_move(soal, x - 1, y, hasil, visited)) return true; // Check kiri
  165.         if (check_move(soal, x + 1, y, hasil, visited)) return true; // Check kanan
  166.  
  167.         // Jika setiap check_move di atas salah, stop program
  168.         hasil[x][y] = 0;
  169.         return false;
  170.     }
  171.     else return false;
  172. }
  173.  
  174. void print_arr(int arr[][limit])
  175. {
  176.     for (int y = 0; y < size; y++)
  177.     {
  178.         for (int x = 0; x < size; x++)
  179.         {
  180.             printf("%d ", arr[x][y]);
  181.         }
  182.         printf("\n");
  183.     }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement