Advertisement
YEZAELP

PROG-1015: Tiling

Jun 6th, 2021
844
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using pii = pair<int, int>;
  5. int n;
  6. int ar[20][20];
  7. bool visited[20][20];
  8. int dx[] = {1, -1, 0, 0};
  9. int dy[] = {0, 0, 1, -1};
  10.  
  11. bool position(int i,int j){
  12.     return i >= 1 and i <= n and j >= 1 and j <= n;
  13. }
  14.  
  15. void fill_visited(int ui, int uj){
  16.     queue <pii> q;
  17.     q.push({ui,uj});
  18.     while(q.size()>0){
  19.         ui = q.front().first;
  20.         uj = q.front().second;
  21.         q.pop();
  22.         if(!visited[ui][uj])
  23.             continue;
  24.         visited[ui][uj] = false;
  25.         for(int d=0;d<4;d++){
  26.             int vi = ui+dx[d];
  27.             int vj = uj+dy[d];
  28.             if(position(vi,vj) and ar[vi][vj] == ar[ui][uj] and visited[vi][vj])
  29.                 q.push({vi,vj});
  30.         }
  31.     }
  32. }
  33.  
  34. int count_num(int i, int j, int cmp){
  35.     int cnt = 0;
  36.     queue <pii> q;
  37.     q.push({i,j});
  38.     while(q.size()>0){
  39.         int ui,uj;
  40.         ui = q.front().first;
  41.         uj = q.front().second;
  42.         q.pop();
  43.         if(visited[ui][uj])
  44.             continue;
  45.         visited[ui][uj] = true;
  46.         cnt ++;
  47.         for(int d=0;d<4;d++){
  48.             int vi,vj;
  49.             vi = ui+dx[d];
  50.             vj = uj+dy[d];
  51.             if(position(vi,vj) and ar[vi][vj] == cmp and !visited[vi][vj]){
  52.                 q.push({vi,vj});
  53.             }
  54.         }
  55.     }
  56.     if(cnt == 3) fill_visited(i,j);
  57.     return cnt;
  58. }
  59.  
  60. int around(int ui,int uj){
  61.     int u = ui-1;
  62.     int d = ui+1;
  63.     int l = uj-1;
  64.     int r = uj+1;
  65.     if(position(u, l) and ar[ui][uj] == ar[u][uj] and ar[ui][uj] == ar[ui][l]) return true;
  66.     if(position(u, r) and ar[ui][uj] == ar[u][uj] and ar[ui][uj] == ar[ui][r]) return true;
  67.     if(position(d, r) and ar[ui][uj] == ar[d][uj] and ar[ui][uj] == ar[ui][r] ) return true;
  68.     if(position(d, l) and ar[ui][uj] == ar[d][uj] and ar[ui][uj] == ar[ui][l] ) return true;
  69.     return false;
  70. }
  71.  
  72. int main(){
  73.  
  74.     scanf("%d", &n);
  75.  
  76.     int ans = 0;
  77.     for(int i=1;i<=n;i++){
  78.         for(int j=1;j<=n;j++){
  79.             scanf("%d", &ar[i][j]);
  80.         }
  81.     }
  82.  
  83.     for(int i=1;i<=n;i++){
  84.         for(int j=1;j<=n;j++){
  85.             if(ar[i][j] == 0) continue;
  86.             if(count_num(i, j, ar[i][j]) == 3 and around(i, j))
  87.                 ans++;
  88.         }
  89.     }
  90.  
  91.     printf("%d", ans);
  92.  
  93.     return 0;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement