Description
Submission
With brute-force, since the magic square is only of order 3
- O(9!) = O(1)
#include <bits/stdc++.h> using namespace std; // Complete the formingMagicSquare function below. bool isMagicSquare(vector<vector<int>>& t) { int sum = 0; for(int i = 0; i < t.size(); ++i) { int s = 0; for(int j = 0; j < t.size(); ++j) { s += t[i][j]; } if(sum == 0) sum = s; if(sum != s) return false; } for(int j = 0; j < t.size(); ++j) { int s = 0; for(int i = 0; i < t.size(); ++i) { s += t[i][j]; } if(sum != s) return false; } int s1 = 0, s2 = 0; for(int i = 0; i < t.size(); ++i) { s1 += t[i][i]; s2 += t[t.size() - i - 1][i]; } if(s1 != sum) return false; if(s2 != sum) return false; return true; } int getDistance(vector<vector<int>>& t, vector<vector<int>>& s) { int sum = 0; for(int i = 0; i < t.size(); ++i) { for(int j = 0; j < t.size(); ++j) { sum += (t[i][j] > s[i][j] ? t[i][j] - s[i][j] : s[i][j] - t[i][j]); } } return sum; } void magicSquare(int x, int y, vector<vector<int>>& t, vector<int>& mark, vector<vector<int>>& s, int& min) { for(int i = 1; i <= 9; i++) { if(mark[i] == 0) { mark[i] = 1; t[x][y] = i; int nextX = x + (y + 1) / 3; int nextY = (y + 1) % 3; if(nextX == 3 && isMagicSquare(t)) { // if it satisfies // get the value int d = getDistance(t, s); // update the smallest if(d < min) min = d; } else { magicSquare(nextX, nextY, t, mark, s, min); } mark[i] = 0; } } } int formingMagicSquare(vector<vector<int>> s) { vector<vector<int>> t = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; vector<int> mark = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int min = 10000; magicSquare(0, 0, t, mark, s, min); return min; } int main() { ofstream fout(getenv("OUTPUT_PATH")); vector<vector<int>> s(3); for (int i = 0; i < 3; i++) { s[i].resize(3); for (int j = 0; j < 3; j++) { cin >> s[i][j]; } cin.ignore(numeric_limits<streamsize>::max(), '\n'); } int result = formingMagicSquare(s); fout << result << "\n"; fout.close(); return 0; }