Advertisement
Dalacul

Untitled

May 17th, 2020
1,041
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define NMAX 102
  5. #define KMAX 1001
  6.  
  7. void read(FILE *fin, int *N, int *M, int *K, int D[], int A[][NMAX]) {
  8.     int i, j;
  9.     fscanf(fin, "%d %d %d", &*N, &*M, &*K);
  10.     for(i = 1; i <= *N; ++i)
  11.         for(j = 1; j <= *M; ++j) {
  12.             fscanf(fin, "%d ", &A[i][j]);
  13.             if(A[i][j] == 1)
  14.                 A[i][j] = 16;
  15.         }
  16.     int ii;
  17.     for(ii = 0; ii < *K; ++ii) {
  18.         fscanf(fin, "%d", &D[ii]);
  19.         D[ii] = 1 << D[ii];
  20.         //modificam putin codificarea directiilor pentru a putea lucra
  21.         // mai bine cu ele
  22.     }
  23.     D[*K] = 15;
  24. }
  25.  
  26. void edging(int N, int M, int A[][NMAX]) {
  27.     int i;
  28.     for(i = 1; i <= M; ++i)
  29.         A[0][i] = A[N + 1][i] = 16;
  30.     for(i = 1; i <= N; ++i)
  31.         A[i][0] = A[i][M + 1] = 16;
  32. }
  33.  
  34. int DFS(int N, int M, int A[][NMAX], int x, int y,
  35.         int D[], int ii, int K, bool F[][NMAX]) {
  36.     static int count = 0;
  37.     if(ii == K) {
  38.         if(F[x][y] == false) {
  39.             ++count;
  40.             F[x][y] = true;
  41.         }
  42.         return;
  43.     }
  44.     int dir = D[ii];
  45.     int next_dir = D[ii + 1];
  46.     int i;
  47.     if(dir == 1)//sus
  48.         for(i = x - 1; ((A[i][y] & dir) || A[i - 1][y] == 16) && i > 0; --i) {
  49.             if(A[i][y] & next_dir)
  50.                 DFS(N, M, A, i, y, D, ii + 1, K, F);
  51.         }
  52.     else if(dir == 2)//jos
  53.         for(i = x + 1; ((A[i][y] & dir) || A[i + 1][y] == 16) && i <= N; ++i) {
  54.             if(A[i][y] & next_dir)
  55.                 DFS(N, M, A, i, y, D, ii + 1, K, F);
  56.         }
  57.     else if(dir == 4)//stanga
  58.         for(i = y - 1; ((A[x][i] & dir) || A[x][i - 1] == 16) && i > 0; --i) {
  59.             if(A[x][i] & next_dir)
  60.                 DFS(N, M, A, x, i, D, ii + 1, K, F);
  61.         }
  62.     else if(dir == 8)//stanga
  63.         for(i = y + 1; ((A[x][i] & dir) || A[x][i + 1] == 16) && i <= M; ++i) {
  64.             if(A[x][i] & next_dir)
  65.                 DFS(N, M, A, x, i, D, ii + 1, K, F);
  66.         }
  67.     return count;
  68. }
  69.  
  70. int solve(int N, int M, int K, int A[][NMAX], int D[]) {
  71.     int i, j, start_i, start_j;
  72.     bool F[NMAX][NMAX];
  73.     int ii = 0;
  74.     edging(N, M, A);
  75.     for(i = 1; i <= N; ++i)
  76.         for(j = 1; j <= M; ++j) {
  77.             F[i][j] = false;
  78.             if(A[i][j] == 0) {
  79.                 if(A[i - 1][j] < 16) //sus
  80.                     A[i][j] |= 1;
  81.                 if(A[i + 1][j] < 16) //jos
  82.                     A[i][j] |= 2;
  83.                 if(A[i][j - 1] < 16) //stanga
  84.                     A[i][j] |= 4;
  85.                 if(A[i][j + 1] < 16) //dreapta
  86.                     A[i][j] |= 8;
  87.             } else if(A[i][j] == 2) {
  88.                 A[i][j] = 0;
  89.                 if(A[i - 1][j] < 16) //sus
  90.                     A[i][j] |= 1;
  91.                 if(A[i + 1][j] < 16) //jos
  92.                     A[i][j] |= 2;
  93.                 if(A[i][j - 1] < 16) //stanga
  94.                     A[i][j] |= 4;
  95.                 if(A[i][j + 1] < 16) //dreapta
  96.                     A[i][j] |= 8;
  97.                 start_i = i;
  98.                 start_j = j;
  99.             }
  100.         }
  101.     int rez = DFS(N, M, A, start_i, start_j,
  102.                   D, ii, K, F);
  103.     return rez;
  104. }
  105.  
  106. int main() {
  107.     int N, M, K, D[KMAX];
  108.     int A[NMAX][NMAX];
  109.     FILE *fin = fopen("labirint.in", "r");
  110.     FILE *fout = fopen("labirint.out", "w");
  111.     //
  112.     read(fin, &N, &M, &K, D, A);
  113.     fprintf(fout, "%d", solve(N, M, K, A, D));
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement