Helicator

shapes.cpp

Dec 6th, 2021
591
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define vi vector<int>
  6. #define ii pair<int,int>
  7. #define fi first
  8. #define sc second
  9. #define stoi stoll
  10. #define popcnt __builtin_popcount
  11. #define getbit(x, k) ((x >> k) & 1)
  12. #define all(x) (x).begin(),(x).end()
  13. #define FOR(i,j,k) for(int i=j; i<k; i++)
  14. #define look(a) cerr <<#a<<": "<<a<<endl;
  15. #define look2(a,b) cerr <<#a<<": "<<a<<" | "<<#b<<": "<<b<< endl;
  16. const int N = 205;
  17.  
  18. char a[N][N],b[N][N];
  19.  
  20. void cuta(int x1mn, int y1mn, int x, int y){
  21.     char c[N][N];
  22.     FOR(i,y1mn,y1mn+y)
  23.         FOR(j,x1mn,x1mn+x)
  24.             c[i-y1mn][j-x1mn] = a[i][j];
  25.     FOR(i,0,y)
  26.         FOR(j,0,x)
  27.             a[i][j] = c[i][j];
  28. }
  29.  
  30. void cutb(int x1mn, int y1mn, int x, int y){
  31.     char c[N][N];
  32.     FOR(i,y1mn,y1mn+y)
  33.         FOR(j,x1mn,x1mn+x)
  34.             c[i-y1mn][j-x1mn] = b[i][j];
  35.     FOR(i,0,y)
  36.         FOR(j,0,x)
  37.             b[i][j] = c[i][j];
  38. }
  39.  
  40. void flip(int x, int y)
  41. {
  42.     char c[N][N];
  43.     FOR(i,0,y)
  44.         FOR(j,0,x)
  45.             c[i][j] = b[j][i];
  46.     FOR(i,0,y)
  47.         FOR(j,0,x)
  48.             b[i][j] = c[i][j];
  49. }
  50.  
  51. bool scan1(int x, int y){
  52.     FOR(i,0,y)
  53.         FOR(j,0,x)
  54.             if (a[i][j] != b[i][j]) return false;
  55.     return true;
  56. }
  57.  
  58. bool scan2(int x, int y){
  59.     FOR(i,0,y)
  60.         FOR(j,0,x)
  61.             if (a[i][j] != b[y-i-1][x-j-1]) return false;
  62.     return true;
  63. }
  64.  
  65. void solve()
  66. {
  67.     int n;
  68.     cin >> n;
  69.     int x1mn = 205,y1mn = 205,x1mx = 0,y1mx = 0;
  70.     int x2mn = 205,y2mn = 205,x2mx = 0,y2mx = 0;
  71.  
  72.     FOR(i,0,n)
  73.     FOR(j,0,n){
  74.         cin >> a[i][j];
  75.         if (a[i][j] == '#'){
  76.             x1mn = min(x1mn,j);
  77.             y1mn = min(y1mn,i);
  78.             x1mx = max(x1mx,j);
  79.             y1mx = max(y1mx,i);
  80.         }
  81.     }
  82.     FOR(i,0,n)
  83.     FOR(j,0,n){
  84.         cin >> b[i][j];
  85.         if (b[i][j] == '#'){
  86.             x2mn = min(x2mn,j);
  87.             y2mn = min(y2mn,i);
  88.             x2mx = max(x2mx,j);
  89.             y2mx = max(y2mx,i);
  90.         }
  91.     }
  92.     if ((x1mx - x1mn == x2mx - x2mn && y1mx - y1mn == y2mx - y2mn) ||
  93.         (x1mx - x1mn == y2mx - y2mn && y1mx - y1mn == x2mx - x2mn)){
  94.  
  95.         int x = x1mx - x1mn + 1;
  96.         int y = y1mx - y1mn + 1;
  97.  
  98.         cuta(x1mn,y1mn,x,y);
  99.        
  100.         cutb(x2mn,y2mn,x,y);
  101.  
  102.         bool test1 = scan1(x,y) || scan2(x,y);
  103.         flip(x,y);
  104.         bool test2 = scan1(x,y) || scan2(x,y);
  105.  
  106.         if (test1 || test2) cout << "Yes";
  107.         else cout << "No";
  108.  
  109.         cout << '\n';
  110.         FOR(i,0,y){
  111.             FOR(j,0,x)
  112.                 cout << a[i][j];
  113.             cout << '\n';
  114.         }
  115.         cout << '\n';
  116.         FOR(i,0,y){
  117.             FOR(j,0,x)
  118.                 cout << b[i][j];
  119.             cout << '\n';
  120.         }
  121.  
  122.         return;
  123.     }
  124.     cout << "No";
  125. }
  126.  
  127. signed main()
  128. {
  129.     cin.tie(0)->sync_with_stdio(0);
  130.     freopen("in", "r", stdin);
  131.     freopen("out", "w", stdout);
  132.     int T = 1;
  133.     // cin >> T;
  134.     while (T--) {
  135.         solve();
  136.         cout << '\n';
  137.     }
  138.     cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  139. }
RAW Paste Data