#include using namespace std; #define SIZE 3 struct Square { int nums[SIZE][SIZE]; Square() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { nums[i][j] = -1; } } } void setBasic() { nums[0][0] = 8; nums[0][1] = 1; nums[0][2] = 6; nums[1][0] = 3; nums[1][1] = 5; nums[1][2] = 7; nums[2][0] = 4; nums[2][1] = 9; nums[2][2] = 2; } void rotate() { int temp = nums[0][1]; nums[0][1] = nums[1][0]; nums[1][0] = nums[2][1]; nums[2][1] = nums[1][2]; nums[1][2] = temp; temp = nums[0][0]; nums[0][0] = nums[2][0]; nums[2][0] = nums[2][2]; nums[2][2] = nums[0][2]; nums[0][2] = temp; } void flip(bool horiz) { if (horiz) { int temp; for (int i = 0; i < SIZE; i++) { temp = nums[i][0]; nums[i][0] = nums[i][2]; nums[i][2] = temp; } } else { int temp; for (int i = 0; i < SIZE; i++) { temp = nums[0][i]; nums[0][i] = nums[2][i]; nums[2][i] = temp; } } } bool isMagic() { int m = -1; for (int i = 0; i < SIZE; i++) { if (m == -1) { m = sumRow(i); if (m == -1 || sumCol(i) != m) return false; } else { if (sumRow(i) != m || sumCol(i) != m) return false; } } if (sumDiag(0) != m || sumDiag(1) != m) return false; return true; } int sumRow(int row) { int sum = 0; for (int i = 0; i < SIZE; i++) { if (nums[row][i] < 0) return -1; else sum += nums[row][i]; } return sum; } int sumCol(int col) { int sum = 0; for (int i = 0; i < SIZE; i++) { if (nums[i][col] < 0) return -1; else sum += nums[i][col]; } return sum; } int sumDiag(int d) { int sum = 0; if (d) { for (int i = 0; i < SIZE; i++) { if (nums[i][i] < 0) return -1; sum += nums[i][i]; } } else { for (int i = 0; i < SIZE; i++) { if (nums[i][SIZE-1-i] < 0) return -1; sum += nums[i][SIZE-1-i]; } } return sum; } void print() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << nums[i][j] << " "; } cout << endl; } } }; int fitSquare(Square & s1, Square & s2) { int diff = -1; bool allX = true; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (s2.nums[i][j] != -1) { allX = false; if (diff == -1) { diff = s2.nums[i][j] - s1.nums[i][j]; if (diff < 0) return -1; } else { if (s2.nums[i][j] - s1.nums[i][j] != diff) return -1; } } } } if (allX) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { s2.nums[i][j] = s1.nums[i][j]; } } } for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (s2.nums[i][j] == -1) { s2.nums[i][j] = s1.nums[i][j] + diff; } } } return diff; } int doRotations(Square & basic, Square & s) { int diff = -1; for (int i = 0; i < 4; i++) { diff = fitSquare(basic, s); if (diff != -1) { s.print(); return diff; } else { basic.rotate(); } } return -1; } void eatwhite(istream & cin) { while (cin.peek() == ' ' || cin.peek() == '\t' || cin.peek() == '\n' || cin.peek() == '\r') cin.get(); } int main() { Square basic; Square s; while (1) { eatwhite(cin); if (cin.peek() == -1) break; basic.setBasic(); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { eatwhite(cin); if (cin.peek() == 'X') { cin.get(); s.nums[i][j] = -1; //cout << i << " " << j << " -1" << endl; } else { cin >> s.nums[i][j]; //cout << i << " " << j << " " << s.nums[i][j] << endl; } } } int diff = -1; if (diff == -1) { diff = doRotations(basic, s); basic.flip(true); } if (diff == -1) { diff = doRotations(basic, s); basic.flip(false); } if (diff == -1) { diff = doRotations(basic, s); basic.flip(true); } if (diff == -1) { diff = doRotations(basic, s); basic.flip(false); } } return 0; }