Guest User

Untitled

a guest
Jul 16th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<vector<int>> getSquare() {
  6. vector<vector<int>> vSquare(3);
  7. for(int i=0; i < 3; ++i) {
  8. vSquare[i].resize(3);
  9. fill(vSquare[i].begin(), vSquare[i].end(), 0);
  10. }
  11.  
  12. // Case 1 : 왼쪽 위. 있으면 시작위치 아래
  13. int iX = 0, iY = 1, iNx = 0, iNy = 0;
  14. vSquare[0][1] = 1;
  15. for(int i=2; i < 10; ++i) {
  16. iNx = iX - 1; // 위
  17. iNy = iY - 1; // 왼쪽
  18. if ( iNx < 0 )
  19. iNx = 2;
  20. if ( iNy < 0 )
  21. iNy = 2;
  22. if ( vSquare[iNx][iNy] == 0 ) {
  23. vSquare[iNx][iNy] = i;
  24. }
  25. else {
  26. iNx = iX + 1; // 아래
  27. iNy = iY;
  28. if ( iNx > 2 )
  29. iNx = 0;
  30. vSquare[iNx][iNy] = i;
  31. }
  32. iX = iNx;
  33. iY = iNy;
  34. }
  35. return vSquare;
  36. }
  37.  
  38. vector<vector<int>> rotateSquare(vector<vector<int>> p_vOrgSquare) {
  39. // 오른쪽으로 회전한다.
  40. vector<vector<int>> vCopy(p_vOrgSquare);
  41.  
  42. for(int i=0; i < 3; ++i) {
  43. for(int j=0; j < 3; ++j) {
  44. if ( i == 0 ) {
  45. p_vOrgSquare[j][2] = vCopy[i][j];
  46. }
  47. else if ( i == 1 ) {
  48. p_vOrgSquare[j][i] = vCopy[i][j];
  49. }
  50. else if ( i == 2 ) {
  51. p_vOrgSquare[j][0] = vCopy[i][j];
  52. }
  53. }
  54. }
  55.  
  56. return p_vOrgSquare;
  57. }
  58.  
  59. // Complete the formingMagicSquare function below.
  60. int formingMagicSquare(vector<vector<int>> s) {
  61. // 모든 Magic Square 구하기
  62.  
  63. // 기준 Magic Square 구하기
  64. vector<vector<int>> vNormalSquare(3);
  65. vNormalSquare = getSquare();
  66.  
  67. // 대칭 Magic Sqaure 구하기
  68. vector<vector<int>> vSymSquare(3);
  69. for(int i=0; i<3; ++i) {
  70. vSymSquare[i].resize(3);
  71. vSymSquare[i][0] = vNormalSquare[i][2];
  72. vSymSquare[i][1] = vNormalSquare[i][1];
  73. vSymSquare[i][2] = vNormalSquare[i][0];
  74. }
  75.  
  76. vector<vector<vector<int>>> vMagicSquare;
  77. vMagicSquare.push_back(vNormalSquare);
  78. vMagicSquare.push_back(vSymSquare);
  79.  
  80. // 회전하면서 나머지 Magic Square 구하기
  81. for(int i=2; i<7; i+=2) {
  82. vNormalSquare = rotateSquare(vNormalSquare);
  83. vSymSquare = rotateSquare(vSymSquare);
  84. vMagicSquare.push_back(vNormalSquare);
  85. vMagicSquare.push_back(vSymSquare);
  86. }
  87.  
  88. // 변경값 계산
  89. int iTotal = 0, iMin = 1000;
  90. for(int i=0; i<8; ++i) {
  91. for(int j=0; j<3; ++j) {
  92. for(int k=0; k<3; ++k) {
  93. if ( s[j][k] != vMagicSquare[i][j][k] )
  94. iTotal += abs(s[j][k] - vMagicSquare[i][j][k]);
  95. }
  96. }
  97. iMin = min(iTotal, iMin);
  98. iTotal = 0;
  99. }
  100.  
  101. return iMin;
  102. }
  103.  
  104. int main()
  105. {
  106. ofstream fout(getenv("OUTPUT_PATH"));
  107.  
  108. vector<vector<int>> s(3);
  109. for (int i = 0; i < 3; i++) {
  110. s[i].resize(3);
  111.  
  112. for (int j = 0; j < 3; j++) {
  113. cin >> s[i][j];
  114. }
  115.  
  116. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  117. }
  118.  
  119. int result = formingMagicSquare(s);
  120.  
  121. fout << result << "\n";
  122.  
  123. fout.close();
  124.  
  125. return 0;
  126. }
Add Comment
Please, Sign In to add comment