Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<string.h>
  5. using namespace std;
  6. int ans;
  7. int a[101][101];
  8. int a_temp[101][101];
  9. int d[101][101];
  10. int wall[101][101]; //
  11. int maxdir[101][101];  //최대값의 방향
  12. int gox[] = { 0,0,0,-1,1 }; // 1번부터 시작
  13. int goy[] = { 0,-1,1,0,0 }; // 1 상 2 하 3 좌 4 우
  14.  
  15. void process()
  16. {
  17.     int n, m, k;
  18.     cin >> n >> m >> k;
  19.  
  20.     //vector<vector<int> > d(n, vector<int>(n));
  21.     //vector<vector<int> > a(n, vector<int>(n));
  22.  
  23.     for (int i = 0; i < k; i++)
  24.     {
  25.         int x = 0, y = 0, q = 0, dir = 0;
  26.  
  27.         cin >> y >> x >> q >> dir;
  28.         d[y][x] = dir;
  29.         a[y][x] = q;
  30.     }
  31.  
  32.     for (int i = 0; i < n; i++)
  33.     {
  34.         wall[0][i] = -1;
  35.         wall[i][0] = -1;
  36.     }
  37.  
  38.     for (int i = 0; i < n; i++)
  39.     {
  40.         wall[n - 1][i] = -1;
  41.         wall[i][n - 1] = -1;
  42.     }
  43.  
  44.  
  45.     while (m--)
  46.     {
  47.         for (int i = 0; i < n; i++)
  48.         {
  49.             for (int j = 0; j < n; j++)
  50.             {
  51.                 if (wall[i][j] != -1 || a[i][j] != 0)
  52.                 {
  53.                     int nx = j + gox[d[i][j]];
  54.                     int ny = i + goy[d[i][j]];
  55.                     if (0 <= nx && nx < n && 0 <= ny && ny < n)
  56.                     {
  57.                         if (a_temp[ny][nx] > 0 && wall[ny][nx] != -1)  // 기존자리에 미생물이 있다 벽이 아니다
  58.                         {
  59.                             if (a_temp[ny][nx] < a[i][j])
  60.                                 maxdir[ny][nx] = d[i][j];
  61.  
  62.                             a_temp[ny][nx] = a_temp[ny][nx] + a[i][j]; //
  63.                         }
  64.                         else if (wall[ny][nx] != -1) // 미생물이 없다. 벽이 아니다.
  65.                         {
  66.                             a_temp[ny][nx] = a[i][j];
  67.                             maxdir[ny][nx] = d[i][j];
  68.                         }
  69.                         else if (wall[ny][nx] == -1) // 벽인가? (int) 미생물 / 2
  70.                         {
  71.                             a_temp[ny][nx] = a[i][j] / 2;
  72.  
  73.                             if (d[i][j] == 1 || d[i][j] == 3) // 방향 반전
  74.                                 maxdir[ny][nx] = d[i][j] + 1;
  75.                             else
  76.                                 maxdir[ny][nx] = d[i][j] - 1;
  77.                         }
  78.                     }
  79.                 }
  80.             }
  81.         }
  82.         memcpy(a, a_temp, sizeof(a));  // 중간결과 덮어쓰기
  83.         memcpy(d, maxdir, sizeof(d));
  84.         memset(a_temp, 0, sizeof(a_temp));
  85.         memset(maxdir, 0, sizeof(maxdir));
  86.     }
  87.  
  88.  
  89.     for (int i = 0; i < n; i++)
  90.     {
  91.         for (int j = 0; j < n; j++)
  92.         {
  93.             ans += a[i][j];
  94.         }
  95.  
  96.     }
  97.  
  98. }
  99.  
  100. int main()
  101. {
  102.     int t;
  103.     //freopen("input.txt", "r", stdin);
  104.     cin >> t;
  105.     int test_case = 1;
  106.     while (t--)
  107.     {
  108.         ans = 0;
  109.         memset(a_temp, 0, sizeof(a_temp));
  110.         memset(maxdir, 0, sizeof(maxdir));
  111.         memset(a, 0, sizeof(a));
  112.         memset(d, 0, sizeof(d));
  113.         memset(wall, 0, sizeof(wall));
  114.         process();
  115.         cout << "#" << test_case << " " << ans << endl;
  116.         test_case++;
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement