SHARE
TWEET

Untitled

a guest Oct 15th, 2019 66 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. typedef pair<int, int> Pair;
  9.  
  10. int N, W;
  11. string board[101][101];
  12. string temp[101][101];
  13.  
  14. Pair left_up;
  15. Pair left_down;
  16. Pair right_up;
  17. Pair right_down;
  18.  
  19. void init()
  20. {
  21.     ios_base::sync_with_stdio(false);
  22.     cin.tie(NULL);
  23.     cout.tie(NULL);
  24.  
  25.     cin >> N >> W;
  26.  
  27.     for (int i = 1; i <= N; i++)
  28.     {
  29.         for (int j = 1; j <= N; j++)
  30.         {
  31.             cin >> board[i][j];
  32.             temp[i][j] = board[i][j];
  33.         }
  34.     }
  35. }
  36.  
  37. Pair get_Rotate_pos(Pair pos, bool way, int cnt, int number)
  38. {
  39.     if (way == true)
  40.     {
  41.         switch (number)
  42.         {
  43.         case 1:
  44.         {
  45.             int temp_cnt = 0;
  46.  
  47.             while (true)
  48.             {
  49.                 while (temp_cnt < cnt && pos.second < right_up.second)
  50.                 {
  51.                     pos.second += 1;
  52.                     temp_cnt++;
  53.                 }
  54.                 if (temp_cnt == cnt)
  55.                     return pos;
  56.  
  57.                 while (temp_cnt < cnt && pos.first < right_down.first)
  58.                 {
  59.                     pos.first += 1;
  60.                     temp_cnt++;
  61.                 }
  62.                 if (temp_cnt == cnt)
  63.                     return pos;
  64.  
  65.                 while (temp_cnt < cnt && pos.second > left_down.second)
  66.                 {
  67.                     pos.second -= 1;
  68.                     temp_cnt++;
  69.                 }
  70.                 if (temp_cnt == cnt)
  71.                     return pos;
  72.  
  73.                 while (temp_cnt < cnt && pos.first>left_up.first)
  74.                 {
  75.                     pos.first -= 1;
  76.                     temp_cnt++;
  77.                 }
  78.                 if (temp_cnt == cnt)
  79.                     return pos;
  80.             }
  81.         }
  82.         break;
  83.  
  84.         case 2:
  85.         {
  86.             int temp_cnt = 0;
  87.  
  88.             while (true)
  89.             {
  90.                 while (temp_cnt < cnt && pos.first < right_down.first)
  91.                 {
  92.                     pos.first += 1;
  93.                     temp_cnt++;
  94.                 }
  95.                 if (temp_cnt == cnt)
  96.                     return pos;
  97.  
  98.                 while (temp_cnt < cnt && pos.second > left_down.second)
  99.                 {
  100.                     pos.second -= 1;
  101.                     temp_cnt++;
  102.                 }
  103.                 if (temp_cnt == cnt)
  104.                     return pos;
  105.  
  106.                 while (temp_cnt < cnt && pos.first>left_up.first)
  107.                 {
  108.                     pos.first -= 1;
  109.                     temp_cnt++;
  110.                 }
  111.                 if (temp_cnt == cnt)
  112.                     return pos;
  113.  
  114.                 while (temp_cnt < cnt && pos.second < right_up.second)
  115.                 {
  116.                     pos.second += 1;
  117.                     temp_cnt++;
  118.                 }
  119.                 if (temp_cnt == cnt)
  120.                     return pos;
  121.             }
  122.         }
  123.         break;
  124.         case 3:
  125.         {
  126.             int temp_cnt = 0;
  127.  
  128.             while (true)
  129.             {
  130.                 while (temp_cnt < cnt && pos.second > left_down.second)
  131.                 {
  132.                     pos.second -= 1;
  133.                     temp_cnt++;
  134.                 }
  135.                 if (temp_cnt == cnt)
  136.                     return pos;
  137.  
  138.                 while (temp_cnt < cnt && pos.first > left_up.first)
  139.                 {
  140.                     pos.first -= 1;
  141.                     temp_cnt++;
  142.                 }
  143.                 if (temp_cnt == cnt)
  144.                     return pos;
  145.  
  146.                 while (temp_cnt < cnt && pos.second < right_up.second)
  147.                 {
  148.                     pos.second += 1;
  149.                     temp_cnt++;
  150.                 }
  151.                 if (temp_cnt == cnt)
  152.                     return pos;
  153.  
  154.                 while (temp_cnt < cnt && pos.first < right_down.first)
  155.                 {
  156.                     pos.first += 1;
  157.                     temp_cnt++;
  158.                 }
  159.                 if (temp_cnt == cnt)
  160.                     return pos;
  161.             }
  162.         }
  163.         break;
  164.         case 4:
  165.         {
  166.             int temp_cnt = 0;
  167.  
  168.             while (true)
  169.             {
  170.                 while (temp_cnt < cnt && pos.first > left_up.first)
  171.                 {
  172.                     pos.first -= 1;
  173.                     temp_cnt++;
  174.                 }
  175.                 if (temp_cnt == cnt)
  176.                     return pos;
  177.  
  178.                 while (temp_cnt < cnt && pos.second < right_up.second)
  179.                 {
  180.                     pos.second += 1;
  181.                     temp_cnt++;
  182.                 }
  183.                 if (temp_cnt == cnt)
  184.                     return pos;
  185.  
  186.                 while (temp_cnt < cnt && pos.first < right_down.first)
  187.                 {
  188.                     pos.first += 1;
  189.                     temp_cnt++;
  190.                 }
  191.                 if (temp_cnt == cnt)
  192.                     return pos;
  193.  
  194.                 while (temp_cnt < cnt && pos.second > left_down.second)
  195.                 {
  196.                     pos.second -= 1;
  197.                     temp_cnt++;
  198.                 }
  199.                 if (temp_cnt == cnt)
  200.                     return pos;
  201.             }
  202.         }
  203.         break;
  204.         }
  205.     }
  206.     else
  207.     {
  208.         //반시계방향
  209.         switch (number)
  210.         {
  211.         case 1:
  212.         {
  213.             int temp_cnt = 0;
  214.  
  215.             while (true)
  216.             {
  217.                 while (temp_cnt < cnt && pos.first < left_down.first)
  218.                 {
  219.                     pos.first += 1;
  220.                     temp_cnt++;
  221.                 }
  222.                 if (temp_cnt == cnt)
  223.                     return pos;
  224.  
  225.                 while (temp_cnt < cnt && pos.second < right_down.second)
  226.                 {
  227.                     pos.second += 1;
  228.                     temp_cnt++;
  229.                 }
  230.                 if (temp_cnt == cnt)
  231.                     return pos;
  232.  
  233.                 while (temp_cnt < cnt && pos.first>right_up.first)
  234.                 {
  235.                     pos.first -= 1;
  236.                     temp_cnt++;
  237.                 }
  238.                 if (temp_cnt == cnt)
  239.                     return pos;
  240.  
  241.                 while (temp_cnt < cnt && pos.second > left_up.second)
  242.                 {
  243.                     pos.second -= 1;
  244.                     temp_cnt++;
  245.                 }
  246.                 if (temp_cnt == cnt)
  247.                     return pos;
  248.             }
  249.         }
  250.         break;
  251.         case 2:
  252.         {
  253.             int temp_cnt = 0;
  254.  
  255.             while (true)
  256.             {
  257.                 while (temp_cnt < cnt && pos.second < right_down.second)
  258.                 {
  259.                     pos.second += 1;
  260.                     temp_cnt++;
  261.                 }
  262.                 if (temp_cnt == cnt)
  263.                     return pos;
  264.  
  265.                 while (temp_cnt < cnt && pos.first>right_up.first)
  266.                 {
  267.                     pos.first -= 1;
  268.                     temp_cnt++;
  269.                 }
  270.                 if (temp_cnt == cnt)
  271.                     return pos;
  272.  
  273.                 while (temp_cnt < cnt && pos.second > left_up.second)
  274.                 {
  275.                     pos.second -= 1;
  276.                     temp_cnt++;
  277.                 }
  278.                 if (temp_cnt == cnt)
  279.                     return pos;
  280.  
  281.                 while (temp_cnt < cnt && pos.first < left_down.first)
  282.                 {
  283.                     pos.first += 1;
  284.                     temp_cnt++;
  285.                 }
  286.                 if (temp_cnt == cnt)
  287.                     return pos;
  288.             }
  289.         }
  290.         break;
  291.         case 3:
  292.         {
  293.             int temp_cnt = 0;
  294.  
  295.             while (true)
  296.             {
  297.                 while (temp_cnt < cnt && pos.first>right_up.first)
  298.                 {
  299.                     pos.first -= 1;
  300.                     temp_cnt++;
  301.                 }
  302.                 if (temp_cnt == cnt)
  303.                     return pos;
  304.  
  305.                 while (temp_cnt < cnt && pos.second > left_up.second)
  306.                 {
  307.                     pos.second -= 1;
  308.                     temp_cnt++;
  309.                 }
  310.                 if (temp_cnt == cnt)
  311.                     return pos;
  312.  
  313.                 while (temp_cnt < cnt && pos.first < left_down.first)
  314.                 {
  315.                     pos.first += 1;
  316.                     temp_cnt++;
  317.                 }
  318.                 if (temp_cnt == cnt)
  319.                     return pos;
  320.  
  321.                 while (temp_cnt < cnt && pos.second < right_down.second)
  322.                 {
  323.                     pos.second += 1;
  324.                     temp_cnt++;
  325.                 }
  326.                 if (temp_cnt == cnt)
  327.                     return pos;
  328.             }
  329.         }
  330.         break;
  331.         case 4:
  332.         {
  333.             int temp_cnt = 0;
  334.  
  335.             while (true)
  336.             {
  337.                 while (temp_cnt < cnt && pos.second > left_up.second)
  338.                 {
  339.                     pos.second -= 1;
  340.                     temp_cnt++;
  341.                 }
  342.                 if (temp_cnt == cnt)
  343.                     return pos;
  344.  
  345.                 while (temp_cnt < cnt && pos.first < left_down.first)
  346.                 {
  347.                     pos.first += 1;
  348.                     temp_cnt++;
  349.                 }
  350.                 if (temp_cnt == cnt)
  351.                     return pos;
  352.  
  353.                 while (temp_cnt < cnt && pos.second < right_down.second)
  354.                 {
  355.                     pos.second += 1;
  356.                     temp_cnt++;
  357.                 }
  358.                 if (temp_cnt == cnt)
  359.                     return pos;
  360.  
  361.                 while (temp_cnt < cnt && pos.first>right_up.first)
  362.                 {
  363.                     pos.first -= 1;
  364.                     temp_cnt++;
  365.                 }
  366.                 if (temp_cnt == cnt)
  367.                     return pos;
  368.             }
  369.         }
  370.         break;
  371.         }
  372.     }
  373.     return pos;
  374. }
  375.  
  376. void rotate()
  377. {
  378.     int turn = N;
  379.     left_up = Pair(1, 1);
  380.     left_down = Pair(N, 1);
  381.     right_up = Pair(1, N);
  382.     right_down = Pair(N, N);
  383.  
  384.     while (turn > 1)
  385.     {
  386.         if (W > 0)
  387.         {
  388.             //시계방향
  389.             for (int t = 1; t <= 4; t++)
  390.             {
  391.                 if (t == 1)
  392.                 {
  393.                     Pair start = left_up;
  394.  
  395.                     for (int i = start.second; i < right_up.second; i++)
  396.                     {
  397.                         Pair rotated_pos = get_Rotate_pos(start, true, W % ((turn - 1) * 4), t);
  398.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  399.                         start = Pair(start.first, start.second + 1);
  400.                     }
  401.                 }
  402.                 else if (t == 2)
  403.                 {
  404.                     Pair start = right_up;
  405.  
  406.                     for (int i = start.first; i < right_down.first; i++)
  407.                     {
  408.                         Pair rotated_pos = get_Rotate_pos(start, true, W % ((turn - 1) * 4), t);
  409.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  410.                         start = Pair(start.first + 1, start.second);
  411.                     }
  412.                 }
  413.                 else if (t == 3)
  414.                 {
  415.                     Pair start = right_down;
  416.  
  417.                     for (int i = start.second; i > left_down.second; i--)
  418.                     {
  419.                         Pair rotated_pos = get_Rotate_pos(start, true, W % ((turn - 1) * 4), t);
  420.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  421.                         start = Pair(start.first, start.second - 1);
  422.                     }
  423.                 }
  424.                 else
  425.                 {
  426.                     Pair start = left_down;
  427.  
  428.                     for (int i = start.first; i > left_up.first; i--)
  429.                     {
  430.                         Pair rotated_pos = get_Rotate_pos(start, true, W % ((turn - 1) * 4), t);
  431.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  432.                         start = Pair(start.first - 1, start.second);
  433.                     }
  434.                 }
  435.             }
  436.         }
  437.         else
  438.         {
  439.             //반시계방향
  440.             for (int t = 1; t <= 4; t++)
  441.             {
  442.                 if (t == 1)
  443.                 {
  444.                     Pair start = left_up;
  445.  
  446.                     for (int i = start.first; i < left_down.first; i++)
  447.                     {
  448.                         Pair rotated_pos = get_Rotate_pos(start, false, abs(W) % ((turn - 1) * 4), t);
  449.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  450.                         start = Pair(start.first + 1, start.second);
  451.                     }
  452.                 }
  453.                 else if (t == 2)
  454.                 {
  455.                     Pair start = left_down;
  456.  
  457.                     for (int i = start.second; i < right_down.second; i++)
  458.                     {
  459.                         Pair rotated_pos = get_Rotate_pos(start, false, abs(W) % ((turn - 1) * 4), t);
  460.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  461.                         start = Pair(start.first, start.second + 1);
  462.                     }
  463.                 }
  464.                 else if (t == 3)
  465.                 {
  466.                     Pair start = right_down;
  467.  
  468.                     for (int i = start.first; i > right_up.first; i--)
  469.                     {
  470.                         Pair rotated_pos = get_Rotate_pos(start, false, abs(W) % ((turn - 1) * 4), t);
  471.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  472.                         start = Pair(start.first - 1, start.second);
  473.                     }
  474.                 }
  475.                 else
  476.                 {
  477.                     Pair start = right_up;
  478.  
  479.                     for (int i = start.second; i > left_up.second; i--)
  480.                     {
  481.                         Pair rotated_pos = get_Rotate_pos(start, false, abs(W) % ((turn - 1) * 4), t);
  482.                         board[rotated_pos.first][rotated_pos.second] = temp[start.first][start.second];
  483.                         start = Pair(start.first, start.second - 1);
  484.                     }
  485.                 }
  486.             }
  487.         }
  488.         turn -= 2;
  489.         W *= -1;
  490.         left_up = Pair(left_up.first + 1, left_up.second + 1);
  491.         left_down = Pair(left_down.first - 1, left_down.second + 1);
  492.         right_up = Pair(right_up.first + 1, right_up.second - 1);
  493.         right_down = Pair(right_down.first - 1, right_down.second - 1);
  494.     }
  495. }
  496.  
  497. int main()
  498. {
  499.     init();
  500.     rotate();
  501.    
  502.     for (int i = 1; i <= N; i++)
  503.     {
  504.         for (int j = 1; j <= N; j++)
  505.         {
  506.             if (j == N)
  507.                 cout << board[i][j]+"\n";
  508.             else
  509.                 cout << board[i][j] + " ";
  510.         }
  511.     }
  512.  
  513.     return 0;
  514. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top