C   113

pipe c

Guest on 6th June 2022 01:15:32 AM

  1. #include <stdio.h>
  2.  
  3. #define RIGHT 0
  4. #define DOWN 1
  5. #define LEFT 2
  6. #define UP 3
  7.  
  8.  
  9. int n, m;
  10. int wayx[4] = {0, 1, 0, -1};
  11. int wayy[4] = {1, 0, -1, 0};
  12. int conn[128][4];
  13. int used[55][55];
  14. char map[55][55];
  15.  
  16. int valid(int x, int y)
  17. {
  18.         return x >= 0 && x < n && y >= 0 && y < m;
  19. }
  20.  
  21. void floodfill(int x, int y)
  22. {
  23.         int i, tx, ty;
  24.         used[x][y] = 1;
  25.         for(i=0; i<4; i++)
  26.         {
  27.                 tx = x + wayx[i];
  28.                 ty = y + wayy[i];
  29.                 if(valid(tx, ty) && !used[tx][ty] && conn[map[x][y]][i] && conn[map[tx][ty]][(i+2)%4])
  30.                 {
  31.                         floodfill(tx, ty);
  32.                 }
  33.         }
  34. }
  35.  
  36. int main()
  37. {
  38.         int i, j, c;
  39.         conn['A'][UP] = conn['A'][LEFT] = 1;
  40.         conn['B'][UP] = conn['B'][RIGHT] = 1;
  41.         conn['C'][DOWN] = conn['C'][LEFT] = 1;
  42.         conn['D'][DOWN] = conn['D'][RIGHT] = 1;
  43.         conn['E'][DOWN] = conn['E'][UP] = 1;
  44.         conn['F'][LEFT] = conn['F'][RIGHT] = 1;
  45.         conn['G'][LEFT] = conn['G'][RIGHT] = conn['G'][UP] = 1;
  46.         conn['H'][LEFT] = conn['H'][DOWN] = conn['H'][UP] = 1;
  47.         conn['I'][LEFT] = conn['I'][RIGHT] = conn['I'][DOWN] = 1;
  48.         conn['J'][RIGHT] = conn['J'][DOWN] = conn['J'][UP] = 1;
  49.         conn['K'][LEFT] = conn['K'][DOWN] = conn['K'][UP] = conn['K'][RIGHT] = 1;
  50.         while(scanf("%d%d", &n, &m) == 2)
  51.         {
  52.                 for(i=0; i<n; i++)
  53.                 {
  54.                         scanf("%s", map[i]);
  55.                 }
  56.                 memset(used, 0, sizeof(used));
  57.                 for(i=0, c=0; i<n; i++)
  58.                 {
  59.                         if(!used[i][0] && conn[map[i][0]][LEFT])
  60.                         {
  61.                                 c++;
  62.                                 floodfill(i, 0);
  63.                         }
  64.                         if(!used[i][m-1] && conn[map[i][m-1]][RIGHT])
  65.                         {
  66.                                 c++;
  67.                                 floodfill(i, m-1);
  68.                         }
  69.                 }
  70.                 for(i=0; i<m; i++)
  71.                 {
  72.                         if(!used[0][i] && conn[map[i][0]][UP])
  73.                         {
  74.                                 c++;
  75.                                 floodfill(0, i);
  76.                         }
  77.                         if(!used[n-1][i] && conn[map[i][0]][DOWN])
  78.                         {
  79.                                 c++;
  80.                                 floodfill(n-1, i);
  81.                         }
  82.                 }
  83.                 printf("%d\n", c);
  84.         }
  85.         return 0;
  86. }

Raw Paste


Login or Register to edit or fork this paste. It's free.